From 439aa2d04d5528b5aed288f70895515d1da2dc3d Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Wed, 7 Jan 2009 17:03:25 +0100 Subject: [PATCH] version 0.7.4 --- config/nimdoc.cfg | 6 +- config/nimrod.cfg | 195 +- copying.txt | 36 +- data/advopt.txt | 2 +- data/ast.yml | 5 +- data/basicopt.txt | 1 + data/magic.yml | 3 + data/messages.yml | 2 +- deinstall.sh | 38 - doc/docs.txt | 17 +- doc/filelist.txt | 95 +- doc/grammar.txt | 239 +- doc/intern.txt | 187 +- doc/manual.txt | 565 +- doc/nimrodc.txt | 66 +- doc/rst.txt | 3 +- doc/theindex.txt | 15006 +++++++++++++++++----------------- doc/tut1.txt | 1382 ++++ doc/tut2.txt | 718 ++ doc/tutorial.txt | 215 - install.sh | 126 - install.txt | 132 +- koch.py | 81 +- lib/arithm.nim | 157 +- lib/base/cgi.nim | 3 +- lib/base/gtk/atk.nim | 2 + lib/base/gtk/gdk2.nim | 2 + lib/base/gtk/gdk2pixbuf.nim | 2 + lib/base/gtk/gdkglext.nim | 2 + lib/base/gtk/glib2.nim | 2 + lib/base/gtk/gtk2.nim | 2 + lib/base/gtk/gtkglext.nim | 2 + lib/base/gtk/gtkhtml.nim | 2 + lib/base/gtk/libglade2.nim | 2 + lib/base/gtk/pango.nim | 2 + lib/base/gtk/pangoutils.nim | 2 + lib/base/sdl/sdl.nim | 3 +- lib/base/sdl/sdl_mixer.nim | 409 +- lib/dyncalls.nim | 2 +- lib/ecmasys.nim | 3 + lib/excpt.nim | 50 +- lib/gc.nim | 39 +- lib/lexbase.nim | 3 +- lib/macros.nim | 106 +- lib/nimbase.h | 14 - lib/os.nim | 9 +- lib/parsecfg.nim | 4 +- lib/parseopt.nim | 2 +- lib/repr.nim | 4 +- lib/strutils.nim | 41 +- lib/sysio.nim | 5 +- lib/sysstr.nim | 7 - lib/system.nim | 96 +- lib/times.nim | 4 +- lib/unicode.nim | 1217 ++- lib/windows/windows.nim | 2 + makefile | 2 +- nim/ast.pas | 459 +- nim/astalgo.pas | 24 +- nim/ccgexprs.pas | 86 +- nim/ccgstmts.pas | 37 +- nim/ccgtypes.pas | 170 +- nim/ccgutils.pas | 42 +- nim/cgen.pas | 459 +- nim/commands.pas | 27 +- nim/docgen.pas | 33 +- nim/ecmasgen.pas | 14 +- nim/evals.pas | 8 +- nim/extccomp.pas | 84 +- nim/hashes.pas | 2 +- nim/lexbase.pas | 5 +- nim/magicsys.pas | 7 +- nim/msgs.pas | 4 +- nim/nimrod.pas | 3 +- nim/nos.pas | 2 + nim/nsystem.pas | 18 +- nim/nversion.pas | 4 +- nim/optast.pas | 34 - nim/options.pas | 14 +- nim/parseopt.pas | 2 +- nim/passaux.pas | 7 +- nim/platform.pas | 6 +- nim/pnimsyn.pas | 355 +- nim/pragmas.pas | 20 +- nim/rnimsyn.pas | 37 +- nim/rodwrite.pas | 2 +- nim/ropes.pas | 3 +- nim/rst.pas | 14 +- nim/scanner.pas | 23 +- nim/sem.pas | 25 +- nim/semdata.pas | 2 + nim/semexprs.pas | 16 +- nim/semfold.pas | 34 +- nim/semstmts.pas | 24 +- nim/semtypes.pas | 19 +- nim/sigmatch.pas | 17 +- nim/strtabs.pas | 3 +- nim/strutils.pas | 7 +- nim/tigen.pas | 47 + nim/transf.pas | 38 +- nim/types.pas | 18 +- nim/wordrecg.pas | 8 +- readme.txt | 42 +- rod/nimrod.cfg | 2 +- rod/readme.txt | 2 +- tests/gtk/ex9.nim | 6 +- tests/readme.txt | 4 - tests/thallo.nim | 31 +- tests/titer.nim | 10 + tests/tlibs.nim | 3 +- tests/tnew.nim | 2 +- todo.txt | 45 +- tools/niminst | Bin 354714 -> 311984 bytes tools/nimweb.nim | 40 +- 114 files changed, 13664 insertions(+), 10110 deletions(-) delete mode 100644 deinstall.sh create mode 100644 doc/tut1.txt create mode 100644 doc/tut2.txt delete mode 100644 doc/tutorial.txt delete mode 100644 install.sh delete mode 100644 nim/optast.pas create mode 100644 nim/tigen.pas diff --git a/config/nimdoc.cfg b/config/nimdoc.cfg index a2a638a89..9a946b641 100644 --- a/config/nimdoc.cfg +++ b/config/nimdoc.cfg @@ -3,7 +3,7 @@ # Feel free to edit the templates as you need. split.item.toc = "20" -# too long entries in the table of contents get truncated +# too long entries in the table of contents wrap around # after this number of characters doc.section = """ @@ -136,6 +136,10 @@ pre, span.tok { background-color:#F9F9F9; border:1px dotted #2F6FAB; color:black; +} + +span.red { + color: #A80000; } /* diff --git a/config/nimrod.cfg b/config/nimrod.cfg index eb8ad707f..dd3b980c9 100644 --- a/config/nimrod.cfg +++ b/config/nimrod.cfg @@ -1,100 +1,95 @@ -# Configuration file for the Nimrod Compiler. -# (c) 2008 Andreas Rumpf - -# Feel free to edit the default values as you need. - -# You may set environment variables with -# @putenv "key" "val" -# Environment variables cannot be used in the options, however! - -cc = @if windows: llvm_gcc @else: gcc @end -lib="$nimrod/lib" -path="$lib/base" -path="$lib/base/gtk" -path="$lib/base/cairo" -path="$lib/base/x11" -path="$lib/base/sdl" -path="$lib/base/opengl" -path="$lib/base/zip" -path="$lib/windows" -path="$lib/posix" -path="$lib/ecmas" -path="$lib/extra" - -@if release: - obj_checks:off - field_checks:off - range_checks:off - bound_checks:off - overflow_checks:off - assertions:off - - stacktrace:off - debugger:off - line_dir:off - opt:speed -@end - -# additional options always passed to the compiler: ---verbosity: "1" - -hint[LineTooLong]=off -#hint[XDeclaredButNotUsed]=off - -@if unix: - @if not bsd: passl= "-ldl" @end -@end - -@if icc: - passl = "-cxxlib" - passc = "-cxxlib" -@end - -# Configuration for the LLVM GCC compiler: -@if windows: - llvm_gcc.path = r"$nimrod\dist\llvm-gcc4.2\bin" -@elif macosx: - llvm_gcc.path = - r"/Users/andreasrumpf/download/C/llvm-gcc4.2-2.3-x86-darwin8/bin" -@end -llvm_gcc.options.debug = "-g" -llvm_gcc.options.always = "-w" -llvm_gcc.options.speed = "-O2" -llvm_gcc.options.size = "-Os" - -# Configuration for the Visual C/C++ compiler: -@if vcc: - passl: r"/F33554432" # set the stack size to 8 MB -@end -vcc.options.debug = "/RTC1 /ZI" -vcc.options.always = "/nologo" -vcc.options.speed = "/Ox /arch:SSE2" -vcc.options.size = "/O1" - -# Configuration for the GNU C/C++ compiler: -@if windows: - gcc.path = r"C:\eigenes\compiler\mingw\bin" -@end -#gcc.exe = "gcc-4.1" -#gcc.linkerExe = "gcc-4.1" -gcc.options.debug = "-g" -@if macosx: - gcc.options.always = "-w -fasm-blocks" -@else: - gcc.options.always = "-w" -@end -gcc.options.speed = "-O3 -fno-strict-aliasing" -gcc.options.size = "-Os" - -# Configuration for the Digital Mars C/C++ compiler: -@if windows: - dmc.path = r"C:\eigenes\compiler\d\dm\bin" -@end - -# Configuration for the Tiny C Compiler: -@if windows: - tcc.path = r"C:\Eigenes\compiler\tcc-0.9.23\tcc" - tcc.options.always = r"-IC:\Eigenes\compiler\tcc-0.9.23\include " & - r"-IC:\Eigenes\compiler\tcc-0.9.23\include\winapi" -@end -tcc.options.always = "-w" +# Configuration file for the Nimrod Compiler. +# (c) 2008 Andreas Rumpf + +# Feel free to edit the default values as you need. + +# You may set environment variables with +# @putenv "key" "val" +# Environment variables cannot be used in the options, however! + +cc = @if windows: llvm_gcc @else: gcc @end +lib="$nimrod/lib" +path="$lib/base" +path="$lib/base/gtk" +path="$lib/base/cairo" +path="$lib/base/x11" +path="$lib/base/sdl" +path="$lib/base/opengl" +path="$lib/base/zip" +path="$lib/windows" +path="$lib/posix" +path="$lib/ecmas" +path="$lib/extra" + +@if release: + obj_checks:off + field_checks:off + range_checks:off + bound_checks:off + overflow_checks:off + assertions:off + + stacktrace:off + debugger:off + line_dir:off + opt:speed + dead_code_elim:on +@end + +# additional options always passed to the compiler: +--verbosity: "1" + +hint[LineTooLong]=off +#hint[XDeclaredButNotUsed]=off + +@if unix: + @if not bsd: passl= "-ldl" @end +@end + +@if icc: + passl = "-cxxlib" + passc = "-cxxlib" +@end + +# Configuration for the LLVM GCC compiler: +llvm_gcc.options.debug = "-g" +llvm_gcc.options.always = "-w" +llvm_gcc.options.speed = "-O2" +llvm_gcc.options.size = "-Os" + +# Configuration for the Visual C/C++ compiler: +@if vcc: + passl: r"/F33554432" # set the stack size to 8 MB +@end +vcc.options.debug = "/RTC1 /ZI" +vcc.options.always = "/nologo" +vcc.options.speed = "/Ox /arch:SSE2" +vcc.options.size = "/O1" + +# Configuration for the GNU C/C++ compiler: +@if windows: + gcc.path = r"C:\eigenes\compiler\mingw\bin" +@end +#gcc.exe = "gcc-4.1" +#gcc.linkerExe = "gcc-4.1" +gcc.options.debug = "-g" +@if macosx: + gcc.options.always = "-w -fasm-blocks" +@else: + gcc.options.always = "-w" +@end +gcc.options.speed = "-O3 -fno-strict-aliasing" +gcc.options.size = "-Os" + +# Configuration for the Digital Mars C/C++ compiler: +@if windows: + dmc.path = r"C:\eigenes\compiler\d\dm\bin" +@end + +# Configuration for the Tiny C Compiler: +@if windows: + tcc.path = r"C:\Eigenes\compiler\tcc-0.9.23\tcc" + tcc.options.always = r"-IC:\Eigenes\compiler\tcc-0.9.23\include " & + r"-IC:\Eigenes\compiler\tcc-0.9.23\include\winapi" +@end +tcc.options.always = "-w" diff --git a/copying.txt b/copying.txt index 65b743e4a..dc61ba805 100644 --- a/copying.txt +++ b/copying.txt @@ -1,18 +1,18 @@ -======================================================= - The Nimrod Compiler - Copyright (C) 2004-2008 Andreas Rumpf -======================================================= - -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; version 2 -of the License. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +======================================================= + The Nimrod Compiler + Copyright (C) 2004-2009 Andreas Rumpf +======================================================= + +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; version 2 +of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. diff --git a/data/advopt.txt b/data/advopt.txt index 4d9dda7c2..ecf3b7b75 100644 --- a/data/advopt.txt +++ b/data/advopt.txt @@ -1,5 +1,5 @@ Advanced commands:: - pas convert a Pascal file to Nimrod standard syntax + pas convert a Pascal file to Nimrod syntax pretty pretty print the inputfile gen_depend generate a DOT file containing the module dependency graph diff --git a/data/ast.yml b/data/ast.yml index 6bbffae3f..b1d55327f 100644 --- a/data/ast.yml +++ b/data/ast.yml @@ -41,6 +41,7 @@ 'sfCompileTime', # proc can be evaluated at compile time 'sfThreadVar', # variable is a thread variable 'sfMerge', # proc can be merged with itself + 'sfDeadCodeElim', # dead code elimination for the module is turned on ], 'TypeFlag': [ @@ -116,7 +117,7 @@ # end of atoms 'nkDotCall', # used to temporarily flag a nkCall node; this is used # for transforming ``s.len`` to ``len(s)`` - 'nkCommand', # a call like ``p 2 4`` without parenthesis + 'nkCommand', # a call like ``p 2, 4`` without parenthesis 'nkCall', # a call like p(x, y) or an operation like +(a, b) 'nkGenericCall', # a call with given type parameters 'nkExplicitTypeListCall', # a call with given explicit typelist @@ -125,6 +126,7 @@ 'nkIdentDefs', # a definition like `a, b: typeDesc = expr` # either typeDesc or expr may be nil; used in # formal parameters, var statements, etc. + 'nkVarTuple', # a ``var (a, b) = expr`` construct 'nkInfix', # a call like (a + b) 'nkPrefix', # a call like !a 'nkPostfix', # something like a! (also used for visibility) @@ -166,6 +168,7 @@ # end of expressions 'nkAsgn', # a = b + 'nkFastAsgn', # internal node for a fast ``a = b`` (no string copy) 'nkDefaultTypeParam', # `ident = typeDesc` in generic parameters 'nkGenericParams', # generic parameters 'nkFormalParams', # formal parameters diff --git a/data/basicopt.txt b/data/basicopt.txt index 7ff8ef136..c10cba63b 100644 --- a/data/basicopt.txt +++ b/data/basicopt.txt @@ -24,6 +24,7 @@ Options: --bound_checks:on|off code generation for bound checks ON|OFF --overflow_checks:on|off code generation for over-/underflow checks ON|OFF -a, --assertions:on|off code generation for assertions ON|OFF + --dead_code_elim:on|off whole program dead code elimination ON|OFF --opt:none|speed|size optimize not at all or for speed|size --app:console|gui|lib generate a console|GUI application or a shared lib -r, --run run the compiled program with given arguments diff --git a/data/magic.yml b/data/magic.yml index 9c03028be..b569159e4 100644 --- a/data/magic.yml +++ b/data/magic.yml @@ -140,6 +140,7 @@ 'FloatToStr', 'CStrToStr', 'StrToStr', +'EnumToStr', # special ones: 'And', @@ -209,6 +210,8 @@ 'NimrodMinor', 'NimrodPatch', 'CpuEndian', +'HostOS', +'HostCPU', 'NaN', 'Inf', 'NegInf', diff --git a/data/messages.yml b/data/messages.yml index a90f9e4a8..c319aa693 100644 --- a/data/messages.yml +++ b/data/messages.yml @@ -142,7 +142,7 @@ 'selector must be of an ordinal type'}, {'errOrdXMustNotBeNegative': 'ord($1) must not be negative'}, {'errLenXinvalid': 'len($1) must be less than 32768'}, -{'errWrongNumberOfLoopVariables': 'wrong number of loop variables'}, +{'errWrongNumberOfVariables': 'wrong number of variables'}, {'errExprCannotBeRaised': 'only objects can be raised'}, {'errBreakOnlyInLoop': "'break' only allowed in loop construct"}, {'errTypeXhasUnknownSize': "type '$1' has unknown size"}, diff --git a/deinstall.sh b/deinstall.sh deleted file mode 100644 index 818b276dc..000000000 --- a/deinstall.sh +++ /dev/null @@ -1,38 +0,0 @@ -#! /bin/sh -# -# Nimrod deinstallation script -# (c) 2008 Andreas Rumpf -# - -if [ $# -eq 1 ] ; then - case $1 in - "/usr/bin") - rm -rf /usr/lib/nimrod - rm -rf /usr/share/nimrod/doc - rm -f /usr/bin/nimrod - rm -f /etc/nimrod.cfg - rm -f /etc/nimdoc.cfg || exit 1 - ;; - "/usr/local/bin") - rm -rf /usr/local/lib/nimrod - rm -rf /usr/local/share/nimrod/doc - rm -f /usr/local/bin/nimrod - rm -f /etc/nimrod.cfg - rm -f /etc/nimdoc.cfg || exit 1 - ;; - *) - rm -rf $1/nimrod || exit 1 - ;; - esac - echo "deinstallation successful" -else - echo "Nimrod deinstallation script" - echo "Usage: [sudo] sh deinstall.sh DIR" - echo "Where DIR may be:" - echo " /usr/bin" - echo " /usr/local/bin" - echo " /opt" - echo " (treated like '/opt')" - exit 1 -fi - diff --git a/doc/docs.txt b/doc/docs.txt index b2fe3ebed..431a79a29 100644 --- a/doc/docs.txt +++ b/doc/docs.txt @@ -3,25 +3,28 @@ The documentation consists of several documents: -- | `First steps after installation `_ - | Read this after installation for a quick introduction. +- | `Nimrod tutorial (part I) `_ + | The Nimrod tutorial part one deals with the basics. + +- | `Nimrod tutorial (part II) `_ + | The Nimrod tutorial part two deals with the advanced language constructs. - | `Nimrod manual `_ - | Read this to get to know the Nimrod programming system. + | The Nimrod manual is a draft that will evolve into a proper specification. - | `User guide for the Nimrod Compiler `_ - | The user guide lists command line arguments, Nimrodc's special features, etc. + | The user guide lists command line arguments, special features of the + compiler, etc. - | `User guide for the Embedded Nimrod Debugger `_ - | This document describes how to use the Embedded debugger. The embedded - debugger currently has no GUI. Please help! + | This document describes how to use the Embedded Debugger. - | `Nimrod library documentation `_ | This document describes Nimrod's standard library. - | `Nimrod internal documentation `_ | The internal documentation describes how the compiler is implemented. Read - this if you want to hack the compiler or develop advanced macros. + this if you want to hack the compiler. - | `Index `_ | The generated index. Often the quickest way to find the piece of diff --git a/doc/filelist.txt b/doc/filelist.txt index 5d9f1125e..fb2f67a37 100644 --- a/doc/filelist.txt +++ b/doc/filelist.txt @@ -1,41 +1,54 @@ -Short description of Nimrod's modules -------------------------------------- - -============== ========================================================== -Module Description -============== ========================================================== -lexbase buffer handling of the lexical analyser -scanner lexical analyser - -ast type definitions of the abstract syntax tree (AST) and - node constructors -astalgo algorithms for containers of AST nodes; converting the - AST to YAML; the symbol table -passes implement the passes managemer for passes over the AST -trees few algorithms for nodes; this module is less important -types module for traversing type graphs; also contain several - helpers for dealing with types - -sigmatch contains the matching algorithm that is used for proc - calls -semexprs contains the semantic checking phase for expressions -semstmts contains the semantic checking phase for statements -semtypes contains the semantic checking phase for types - -idents implements a general mapping from identifiers to an internal - representation (``PIdent``) that is used, so that a simple - id-comparison suffices to say whether two Nimrod identifiers - are equivalent - -ropes implements long strings using represented as trees for - lazy evaluation; used mainly by the code generators - -ccgobj contains type definitions neeeded for C code generation - and some helpers -ccgutils contains helpers for the C code generator -ccgtypes the generator for C types -ccgstmts the generator for statements -ccgexprs the generator for expressions -extccomp this module calls the C compiler and linker; interesting - if you want to add support for a new C compiler -============== ========================================================== +Short description of Nimrod's modules +------------------------------------- + +============== ========================================================== +Module Description +============== ========================================================== +nimrod main module: parses the command line and calls + ```main.MainCommand`` +main implements the top-level command dispatching +lexbase buffer handling of the lexical analyser +scanner lexical analyser +pnimsyn Nimrod's parser +rnimsyn Nimrod code renderer (AST back to its textual form) + +paslex lexer for Pascal +pasparse parser for Pascal; Pascal's advanced OO features are not + supported + +options contains global and local compiler options +ast type definitions of the abstract syntax tree (AST) and + node constructors +astalgo algorithms for containers of AST nodes; converting the + AST to YAML; the symbol table +passes implement the passes managemer for passes over the AST +trees few algorithms for nodes; this module is less important +types module for traversing type graphs; also contain several + helpers for dealing with types + +sigmatch contains the matching algorithm that is used for proc + calls +semexprs contains the semantic checking phase for expressions +semstmts contains the semantic checking phase for statements +semtypes contains the semantic checking phase for types +semfold contains code to deal with constant folding +evals contains an AST interpreter for compile time evaluation +pragmas semantic checking of pragmas + +idents implements a general mapping from identifiers to an internal + representation (``PIdent``) that is used, so that a simple + id-comparison suffices to say whether two Nimrod identifiers + are equivalent +ropes implements long strings represented as trees for + lazy evaluation; used mainly by the code generators + +transf transformations on the AST that need to be done before + code generation +cgen main file of the C code generator +ccgutils contains helpers for the C code generator +ccgtypes the generator for C types +ccgstmts the generator for statements +ccgexprs the generator for expressions +extccomp this module calls the C compiler and linker; interesting + if you want to add support for a new C compiler +============== ========================================================== diff --git a/doc/grammar.txt b/doc/grammar.txt index ee46cd63a..fa5a0d036 100644 --- a/doc/grammar.txt +++ b/doc/grammar.txt @@ -1,45 +1,43 @@ module ::= ([COMMENT] [SAD] stmt)* comma ::= ',' [COMMENT] [IND] -operator ::= OP0 | OR | XOR | AND | OP3 | OP4 | OP5 | IS | ISNOT | IN | NOTIN - | OP6 | DIV | MOD | SHL | SHR | OP7 | NOT +operator ::= OP0 | OR | XOR | AND | OP3 | OP4 | OP5 | OP6 | OP7 + | 'is' | 'isnot' | 'in' | 'notin' + | 'div' | 'mod' | 'shl' | 'shr' | 'not' -prefixOperator ::= OP0 | OP3 | OP4 | OP5 | OP6 | OP7 | NOT +prefixOperator ::= OP0 | OP3 | OP4 | OP5 | OP6 | OP7 | 'not' optInd ::= [COMMENT] [IND] -lowestExpr ::= orExpr ( OP0 optInd orExpr )* -orExpr ::= andExpr ( OR | XOR optInd andExpr )* -andExpr ::= cmpExpr ( AND optInd cmpExpr )* -cmpExpr ::= ampExpr ( OP3 | IS | ISNOT | IN | NOTIN optInd ampExpr )* -ampExpr ::= plusExpr ( OP4 optInd plusExpr )* -plusExpr ::= mulExpr ( OP5 optInd mulExpr )* -mulExpr ::= dollarExpr ( OP6 | DIV | MOD | SHL | SHR optInd dollarExpr )* -dollarExpr ::= primary ( OP7 optInd primary )* +lowestExpr ::= orExpr (OP0 optInd orExpr)* +orExpr ::= andExpr (OR | 'xor' optInd andExpr)* +andExpr ::= cmpExpr ('and' optInd cmpExpr)* +cmpExpr ::= ampExpr (OP3 | 'is' | 'isnot' | 'in' | 'notin' optInd ampExpr)* +ampExpr ::= plusExpr (OP4 optInd plusExpr)* +plusExpr ::= mulExpr (OP5 optInd mulExpr)* +mulExpr ::= dollarExpr (OP6 | 'div' | 'mod' | 'shl' | 'shr' optInd dollarExpr)* +dollarExpr ::= primary (OP7 optInd primary)* namedTypeOrExpr ::= - DOTDOT [expr] - | expr [EQUALS (expr [DOTDOT expr] | typeDescK | DOTDOT [expr] ) - | DOTDOT [expr]] + '..' [expr] + | expr ['=' (expr ['..' expr] | typeDescK | '..' [expr]) | '..' [expr]] | typeDescK -castExpr ::= CAST BRACKET_LE optInd typeDesc BRACKERT_RI - PAR_LE optInd expr PAR_RI -addrExpr ::= ADDR PAR_LE optInd expr PAR_RI -symbol ::= ACC (KEYWORD | IDENT | operator | PAR_LE PAR_RI - | BRACKET_LE BRACKET_RI | EQUALS | literal )+ ACC +castExpr ::= 'cast' '[' optInd typeDesc [SAD] ']' '(' optInd expr [SAD] ')' +addrExpr ::= 'addr' '(' optInd expr ')' +symbol ::= '`' (KEYWORD | IDENT | operator | '(' ')' + | '[' ']' | '=' | literal)+ '`' | IDENT -primary ::= ( prefixOperator optInd )* ( symbol | constructor | - | castExpr | addrExpr ) ( - DOT optInd symbol - #| CURLY_LE namedTypeDescList CURLY_RI - | PAR_LE optInd namedExprList PAR_RI - | BRACKET_LE optInd - [ namedTypeOrExpr (comma namedTypeOrExpr)* [comma] ] - BRACKET_RI - | CIRCUM - | pragma )* +primary ::= (prefixOperator optInd)* (symbol | constructor | + | castExpr | addrExpr) ( + '.' optInd symbol + | '(' optInd namedExprList [SAD] ')' + | '[' optInd + [namedTypeOrExpr (comma namedTypeOrExpr)* [comma]] + [SAD] ']' + | '^' + | pragma)* literal ::= INT_LIT | INT8_LIT | INT16_LIT | INT32_LIT | INT64_LIT | FLOAT_LIT | FLOAT32_LIT | FLOAT64_LIT @@ -48,48 +46,42 @@ literal ::= INT_LIT | INT8_LIT | INT16_LIT | INT32_LIT | INT64_LIT | NIL constructor ::= literal - | BRACKET_LE optInd colonExprList BRACKET_RI # []-Constructor - | CURLY_LE optInd sliceExprList CURLY_RI # {}-Constructor - | PAR_LE optInd colonExprList PAR_RI # ()-Constructor + | '[' optInd colonExprList [SAD] ']' + | '{' optInd sliceExprList [SAD] '}' + | '(' optInd colonExprList [SAD] ')' -exprList ::= [ expr (comma expr)* [comma] ] +colonExpr ::= expr [':' expr] +colonExprList ::= [colonExpr (comma colonExpr)* [comma]] -colonExpr ::= expr [COLON expr] -colonExprList ::= [ colonExpr (comma colonExpr)* [comma] ] +namedExpr ::= expr ['=' expr] +namedExprList ::= [namedExpr (comma namedExpr)* [comma]] -namedExpr ::= expr [EQUALS expr] # actually this is symbol EQUALS expr|expr -namedExprList ::= [ namedExpr (comma namedExpr)* [comma] ] +sliceExpr ::= expr ['..' expr] +sliceExprList ::= [sliceExpr (comma sliceExpr)* [comma]] -sliceExpr ::= expr [ DOTDOT expr ] -sliceExprList ::= [ sliceExpr (comma sliceExpr)* [comma] ] - -anonymousProc ::= LAMBDA paramList [pragma] EQUALS stmt +anonymousProc ::= 'lambda' paramList [pragma] '=' stmt expr ::= lowestExpr | anonymousProc - | IF expr COLON expr - (ELIF expr COLON expr)* - ELSE COLON expr + | 'if' expr ':' expr ('elif' expr ':' expr)* 'else' ':' expr -namedTypeDesc ::= typeDescK | expr [EQUALS (typeDescK | expr)] -namedTypeDescList ::= [ namedTypeDesc (comma namedTypeDesc)* [comma] ] +namedTypeDesc ::= typeDescK | expr ['=' (typeDescK | expr)] +namedTypeDescList ::= [namedTypeDesc (comma namedTypeDesc)* [comma]] -qualifiedIdent ::= symbol [ DOT symbol ] +qualifiedIdent ::= symbol ['.' symbol] -typeDescK ::= VAR typeDesc - | REF typeDesc - | PTR typeDesc - | TYPE expr - | TUPLE tupleDesc - | PROC paramList [pragma] +typeDescK ::= 'var' typeDesc + | 'ref' typeDesc + | 'ptr' typeDesc + | 'type' expr + | 'tuple' tupleDesc + | 'proc' paramList [pragma] typeDesc ::= typeDescK | primary -optSemicolon ::= [SEMICOLON] - -macroStmt ::= COLON [stmt] (OF [sliceExprList] COLON stmt - | ELIF expr COLON stmt - | EXCEPT exceptList COLON stmt )* - [ELSE COLON stmt] +macroStmt ::= ':' [stmt] ('of' [sliceExprList] ':' stmt + |'elif' expr ':' stmt + |'except' exceptList ':' stmt )* + ['else' ':' stmt] simpleStmt ::= returnStmt | yieldStmt @@ -107,88 +99,91 @@ complexStmt ::= ifStmt | whileStmt | caseStmt | tryStmt | forStmt | procDecl | iteratorDecl | macroDecl | templateDecl | constSection | typeSection | whenStmt | varSection -indPush ::= IND # push +indPush ::= IND # and push indentation onto the stack +indPop ::= # pop indentation from the stack + stmt ::= simpleStmt [SAD] | indPush (complexStmt | simpleStmt) - ([SAD] (complexStmt | simpleStmt) )* - DED + ([SAD] (complexStmt | simpleStmt))* + DED indPop -exprStmt ::= lowestExpr [EQUALS expr | [expr (comma expr)* [comma]] [macroStmt]] -returnStmt ::= RETURN [expr] -yieldStmt ::= YIELD expr -discardStmt ::= DISCARD expr -raiseStmt ::= RAISE [expr] -breakStmt ::= BREAK [symbol] -continueStmt ::= CONTINUE -ifStmt ::= IF expr COLON stmt (ELIF expr COLON stmt)* [ELSE COLON stmt] -whenStmt ::= WHEN expr COLON stmt (ELIF expr COLON stmt)* [ELSE COLON stmt] -caseStmt ::= CASE expr (OF sliceExprList COLON stmt)* - (ELIF expr COLON stmt)* - [ELSE COLON stmt] -whileStmt ::= WHILE expr COLON stmt -forStmt ::= FOR symbol (comma symbol)* [comma] IN expr [DOTDOT expr] COLON stmt -exceptList ::= [qualifiedIdent (comma qualifiedIdent)* [comma]] +exprStmt ::= lowestExpr ['=' expr | [expr (comma expr)*] [macroStmt]] +returnStmt ::= 'return' [expr] +yieldStmt ::= 'yield' expr +discardStmt ::= 'discard' expr +raiseStmt ::= 'raise' [expr] +breakStmt ::= 'break' [symbol] +continueStmt ::= 'continue' +ifStmt ::= 'if' expr ':' stmt ('elif' expr ':' stmt)* ['else' ':' stmt] +whenStmt ::= 'when' expr ':' stmt ('elif' expr ':' stmt)* ['else' ':' stmt] +caseStmt ::= 'case' expr [':'] ('of' sliceExprList ':' stmt)* + ('elif' expr ':' stmt)* + ['else' ':' stmt] +whileStmt ::= 'while' expr ':' stmt +forStmt ::= 'for' symbol (comma symbol)* 'in' expr ['..' expr] ':' stmt +exceptList ::= [qualifiedIdent (comma qualifiedIdent)*] -tryStmt ::= TRY COLON stmt - (EXCEPT exceptList COLON stmt)* - [FINALLY COLON stmt] -asmStmt ::= ASM [pragma] (STR_LIT | RSTR_LIT | TRIPLESTR_LIT) -blockStmt ::= BLOCK [symbol] COLON stmt +tryStmt ::= 'try' ':' stmt + ('except' exceptList ':' stmt)* + ['finally' ':' stmt] +asmStmt ::= 'asm' [pragma] (STR_LIT | RSTR_LIT | TRIPLESTR_LIT) +blockStmt ::= 'block' [symbol] ':' stmt filename ::= symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT -importStmt ::= IMPORT filename (comma filename)* [comma] -includeStmt ::= INCLUDE filename (comma filename)* [comma] -fromStmt ::= FROM filename IMPORT symbol (comma symbol)* [comma] +importStmt ::= 'import' filename (comma filename)* +includeStmt ::= 'include' filename (comma filename)* +fromStmt ::= 'from' filename 'import' symbol (comma symbol)* -pragma ::= CURLYDOT_LE colonExprList (CURLYDOT_RI | CURLY_RI) +pragma ::= '{.' optInd (colonExpr [comma])* [SAD] ('.}' | '}') -param ::= symbol (comma symbol)* [comma] COLON typeDesc -paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc] +param ::= symbol (comma symbol)* ':' typeDesc +paramList ::= ['(' [param (comma param)*] [SAD] ')'] [':' typeDesc] -genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI +genericParam ::= symbol [':' typeDesc] +genericParams ::= '[' genericParam (comma genericParam)* [SAD] ']' -procDecl ::= PROC symbol ["*"] [genericParams] - paramList [pragma] - [EQUALS stmt] -macroDecl ::= MACRO symbol ["*"] [genericParams] paramList [pragma] - [EQUALS stmt] -iteratorDecl ::= ITERATOR symbol ["*"] [genericParams] paramList [pragma] - [EQUALS stmt] -templateDecl ::= TEMPLATE symbol ["*"] [genericParams] paramList [pragma] - [EQUALS stmt] +procDecl ::= 'proc' symbol ['*'] [genericParams] paramList [pragma] + ['=' stmt] +macroDecl ::= 'macro' symbol ['*'] [genericParams] paramList [pragma] + ['=' stmt] +iteratorDecl ::= 'iterator' symbol ['*'] [genericParams] paramList [pragma] + ['=' stmt] +templateDecl ::= 'template' symbol ['*'] [genericParams] paramList [pragma] + ['=' stmt] -colonAndEquals ::= [COLON typeDesc] EQUALS expr +colonAndEquals ::= [':' typeDesc] '=' expr -constDecl ::= symbol ["*"] [pragma] colonAndEquals [COMMENT | IND COMMENT] +constDecl ::= symbol ['*'] [pragma] colonAndEquals [COMMENT | IND COMMENT] | COMMENT -constSection ::= CONST indPush constDecl (SAD constDecl)* DED +constSection ::= 'const' indPush constDecl (SAD constDecl)* DED indPop typeDef ::= typeDesc | objectDef | enumDef -objectField ::= symbol ["*"] [pragma] +objectField ::= symbol ['*'] [pragma] objectIdentPart ::= - objectField (comma objectField)* [comma] COLON typeDesc [COMMENT|IND COMMENT] + objectField (comma objectField)* ':' typeDesc [COMMENT|IND COMMENT] -objectWhen ::= WHEN expr COLON [COMMENT] objectPart - (ELIF expr COLON [COMMENT] objectPart)* - [ELSE COLON [COMMENT] objectPart] -objectCase ::= CASE expr COLON typeDesc [COMMENT] - (OF sliceExprList COLON [COMMENT] objectPart)* - [ELSE COLON [COMMENT] objectPart] +objectWhen ::= 'when' expr ':' [COMMENT] objectPart + ('elif' expr ':' [COMMENT] objectPart)* + ['else' ':' [COMMENT] objectPart] +objectCase ::= 'case' expr ':' typeDesc [COMMENT] + ('of' sliceExprList ':' [COMMENT] objectPart)* + ['else' ':' [COMMENT] objectPart] -objectPart ::= objectWhen | objectCase | objectIdentPart | NIL - | indPush objectPart (SAD objectPart)* DED -tupleDesc ::= BRACKET_LE optInd [param (comma param)* [comma]] BRACKET_RI +objectPart ::= objectWhen | objectCase | objectIdentPart | 'nil' + | indPush objectPart (SAD objectPart)* DED indPop +tupleDesc ::= '[' optInd [param (comma param)*] [SAD] ']' -objectDef ::= OBJECT [pragma] [OF typeDesc] objectPart -enumField ::= symbol [EQUALS expr] -enumDef ::= ENUM [OF typeDesc] (enumField [comma | COMMENT | IND COMMENT])+ +objectDef ::= 'object' [pragma] ['of' typeDesc] objectPart +enumField ::= symbol ['=' expr] +enumDef ::= 'enum' ['of' typeDesc] (enumField [comma] [COMMENT | IND COMMENT])+ typeDecl ::= COMMENT - | symbol ["*"] [genericParams] [EQUALS typeDef] [COMMENT | IND COMMENT] + | symbol ['*'] [genericParams] ['=' typeDef] [COMMENT | IND COMMENT] -typeSection ::= TYPE indPush typeDecl (SAD typeDecl)* DED +typeSection ::= 'type' indPush typeDecl (SAD typeDecl)* DED indPop -colonOrEquals ::= COLON typeDesc [EQUALS expr] | EQUALS expr -varField ::= symbol ["*"] [pragma] -varPart ::= symbol (comma symbol)* [comma] colonOrEquals [COMMENT | IND COMMENT] -varSection ::= VAR (varPart - | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED) +colonOrEquals ::= ':' typeDesc ['=' expr] | '=' expr +varField ::= symbol ['*'] [pragma] +varPart ::= symbol (comma symbol)* colonOrEquals [COMMENT | IND COMMENT] +varSection ::= 'var' (varPart + | indPush (COMMENT|varPart) + (SAD (COMMENT|varPart))* DED indPop) diff --git a/doc/intern.txt b/doc/intern.txt index 4d65c1e55..6496e0e29 100644 --- a/doc/intern.txt +++ b/doc/intern.txt @@ -34,7 +34,6 @@ Path Purpose on it! ``web`` website of Nimrod; generated by ``koch.py`` from the ``*.txt`` and ``*.tmpl`` files -``koch`` the Koch Build System (written for Nimrod) ``obj`` generated ``*.obj`` files go into here ============ ============================================== @@ -45,44 +44,76 @@ Bootstrapping the compiler The compiler is written in a subset of Pascal with special annotations so that it can be translated to Nimrod code automatically. This conversion is done by Nimrod itself via the undocumented ``boot`` command. Thus both Nimrod -and Free Pascal can compile the Nimrod compiler. +and Free Pascal can compile the Nimrod compiler. However, the Pascal version +has no garbage collector and leaks memory like crazy! So the Pascal version +should only be used for bootstrapping. Requirements for bootstrapping: -- Free Pascal (I used version 2.2) [optional] -- Python (should work with version 1.5 or higher) +- Python (should work with version 1.5 or higher) (optional) +- supported C compiler -- C compiler -- one of: +Compiling the compiler is a simple matter of running:: - * win32-lcc (currently broken) - * Borland C++ (tested with 5.5; currently broken) - * Microsoft C++ - * Digital Mars C++ - * Watcom C++ (currently broken) - * GCC - * Intel C++ - * Pelles C (currently broken) - * llvm-gcc + koch.py boot -| Compiling the compiler is a simple matter of running: -| ``koch.py boot`` -| Or you can compile by hand, this is not difficult. +For a release version use:: -If you want to debug the compiler, use the command:: + koch.py boot -d:release - koch.py boot --debugger:on +The ``koch.py`` script is Nimrod's maintainance script. It is a replacement for +make and shell scripting with the advantage that it is much more portable. -The ``koch.py`` script is Nimrod's maintainance script: Everything that has -been automated is accessible with it. It is a replacement for make and shell -scripting with the advantage that it is more portable. +If you don't have Python, there is a ``boot`` Nimrod program which does roughly +the same:: + + nimrod cc boot.nim + ./boot [-d:release] -Coding standards -================ +Pascal annotations +================== +There are some annotations that the Pascal sources use so that they can +be converted to Nimrod automatically: -The compiler is written in a subset of Pascal with special annotations so -that it can be translated to Nimrod code automatically. As a general rule, -Pascal code that does not translate to Nimrod automatically is forbidden. +``{@discard} `` + Tells the compiler that a ``discard`` statement is needed for Nimrod + here. + +``{@cast}typ(expr)`` + Tells the compiler that the Pascal conversion is a ``cast`` in Nimrod. + +``{@emit }`` + Emits ````. The code fragment needs to be in Pascal syntax. + +``{@ignore} {@emit }`` + Ignores ```` and instead emits ```` which needs to be in + Pascal syntax. An empty ``{@emit}`` is possible too (it then only closes + the ```` part). + +``record {@tuple}`` + Is used to tell the compiler that the record type should be transformed + to a Nimrod tuple type. + +``^ {@ptr}`` + Is used to tell the compiler that the pointer type should be transformed + to a Nimrod ``ptr`` type. The default is a ``ref`` type. + +``'a' + ''`` + The idiom ``+''`` is used to tell the compiler that it is a string + literal and not a character literal. (Pascal does not distinguish between + character literals and string literals of length 1.) + +``+{&}`` + This tells the compiler that Pascal's ``+`` here is a string concatenation + and thus should be converted to ``&``. Note that this is not needed if + any of the operands is a string literal because the compiler then can + figure this out by itself. + +``{@set}['a', 'b', 'c']`` + Tells the compiler that Pascal's ``[]`` constructor is a set and not an + array. This is only needed if the compiler cannot figure this out for + itself. Porting to new platforms @@ -99,7 +130,7 @@ check that the OS, System modules work and recompile Nimrod. The only case where things aren't as easy is when the garbage collector needs some assembler tweaking to work. The standard version of the GC uses C's ``setjmp`` function to store all registers -on the hardware stack. It may be that the new platform needs to +on the hardware stack. It may be necessary that the new platform needs to replace this generic code by some assembler code. @@ -132,11 +163,11 @@ The Garbage Collector Introduction ------------ -We use the term *cell* here to refer to everything that is traced +I use the term *cell* here to refer to everything that is traced (sequences, refs, strings). This section describes how the new GC works. -The basic algorithm is *Deferrent reference counting* with cycle detection. +The basic algorithm is *Deferrent Reference Counting* with cycle detection. References in the stack are not counted for better performance and easier C code generation. @@ -170,7 +201,7 @@ modifying a ``TCellSet`` during traversation leads to undefined behaviour. iterator elements(s: TCellSet): (elem: PCell) -All the operations have to be perform efficiently. Because a Cellset can +All the operations have to perform efficiently. Because a Cellset can become huge a hash table alone is not suitable for this. We use a mixture of bitset and hash table for this. The hash table maps *pages* @@ -246,16 +277,10 @@ This syntax tree is the interface between the parser and the code generator. It is essential to understand most of the compiler's code. In order to compile Nimrod correctly, type-checking has to be seperated from -parsing. Otherwise generics would not work. Code generation is done for a -whole module only after it has been checked for semantics. +parsing. Otherwise generics would not work. .. include:: filelist.txt -The first command line argument selects the backend. Thus the backend is -responsible for calling the parser and semantic checker. However, when -compiling ``import`` or ``include`` statements, the semantic checker needs to -call the backend, this is done by embedding a PBackend into a TContext. - The syntax tree --------------- @@ -265,7 +290,7 @@ may contain cycles. The AST changes its shape after semantic checking. This is needed to make life easier for the code generators. See the "ast" module for the type definitions. -We use the notation ``nodeKind(fields, [sons])`` for describing +I use the notation ``nodeKind(fields, [sons])`` for describing nodes. ``nodeKind[sons]`` is a short-cut for ``nodeKind([sons])``. XXX: Description of the language's syntax and the corresponding trees. @@ -273,12 +298,16 @@ XXX: Description of the language's syntax and the corresponding trees. How the RTL is compiled ======================= -The system module contains the part of the RTL which needs support by +The ``system`` module contains the part of the RTL which needs support by compiler magic (and the stuff that needs to be in it because the spec says so). The C code generator generates the C code for it just like any other module. However, calls to some procedures like ``addInt`` are inserted by -the CCG. Therefore the module ``magicsys`` contains a table -(``compilerprocs``) with all symbols that are marked as ``compilerproc``. +the CCG. Therefore the module ``magicsys`` contains a table (``compilerprocs``) +with all symbols that are marked as ``compilerproc``. ``compilerprocs`` are +needed by the code generator. A ``magic`` proc is not the same as a +``compilerproc``: A ``magic`` is a proc that needs compiler magic for its +semantic checking, a ``compilerproc`` is a proc that is used by the code +generator. @@ -290,77 +319,3 @@ underlying C compiler already does all the hard work for us. The problem is the common runtime library, especially the memory manager. Note that Borland's Delphi had exactly the same problem. The workaround is to not link the GC with the Dll and provide an extra runtime dll that needs to be initialized. - - - -How to implement closures -========================= - -A closure is a record of a proc pointer and a context ref. The context ref -points to a garbage collected record that contains the needed variables. -An example: - -.. code-block:: Nimrod - - type - TListRec = record - data: string - next: ref TListRec - - proc forEach(head: ref TListRec, visitor: proc (s: string) {.closure.}) = - var it = head - while it != nil: - visit(it.data) - it = it.next - - proc sayHello() = - var L = new List(["hallo", "Andreas"]) - var temp = "jup\xff" - forEach(L, lambda(s: string) = - io.write(temp) - io.write(s) - ) - - -This should become the following in C: - -.. code-block:: C - typedef struct ... /* List type */ - - typedef struct closure { - void (*PrcPart)(string, void*); - void* ClPart; - } - - typedef struct Tcl_data { - string temp; // all accessed variables are put in here! - } - - void forEach(TListRec* head, const closure visitor) { - TListRec* it = head; - while (it != NIM_NULL) { - visitor.prc(it->data, visitor->cl_data); - it = it->next; - } - } - - void printStr(string s, void* cl_data) { - Tcl_data* x = (Tcl_data*) cl_data; - io_write(x->temp); - io_write(s); - } - - void sayhello() { - Tcl_data* data = new(...); - asgnRef(&data->temp, "jup\xff"); - ... - - closure cl; - cl.prc = printStr; - cl.cl_data = data; - foreach(L, cl); - } - - -What about nested closure? - There's not much difference: Just put all used -variables in the data record. diff --git a/doc/manual.txt b/doc/manual.txt index cd982302f..04b8bb97b 100644 --- a/doc/manual.txt +++ b/doc/manual.txt @@ -11,6 +11,10 @@ Nimrod Manual About this document =================== +**Note**: This document is a draft! Several of Nimrod's features need more +precise wording. This manual will evolve into a proper specification some +day. + This document describes the lexis, the syntax, and the semantics of Nimrod. The language constructs are explained using an extended BNF, in @@ -18,10 +22,11 @@ which ``(a)*`` means 0 or more ``a``'s, ``a+`` means 1 or more ``a``'s, and ``(a)?`` means an optional *a*; an alternative spelling for optional parts is ``[a]``. The ``|`` symbol is used to mark alternatives and has the lowest precedence. Parentheses may be used to group elements. -Non-terminals are in lowercase, terminal symbols (including keywords) are in -UPPERCASE. An example:: +Non-terminals start with a lowercase letter, abstract terminal symbols are in +UPPERCASE. Verbatim terminal symbols (including keywords) are quoted +with ``'``. An example:: - if_stmt ::= IF expr COLON stmts (ELIF expr COLON stmts)* [ELSE stmts] + ifStmt ::= 'if' expr ':' stmts ('elif' expr ':' stmts)* ['else' stmts] Other parts of Nimrod - like scoping rules or runtime semantics are only described in an informal manner. The reason is that formal semantics are @@ -90,8 +95,7 @@ Indentation consists only of spaces; tabulators are not allowed. The terminals ``IND`` (indentation), ``DED`` (dedentation) and ``SAD`` (same indentation) are generated by the scanner, denoting an indentation. -These terminals are only generated for lines that are not empty or contain -only whitespace and comments. +These terminals are only generated for lines that are not empty. The parser and the scanner communicate over a stack which indentation terminal should be generated: The stack consists of integers counting the spaces. The @@ -100,14 +104,17 @@ If the current indentation token consists of more spaces than the entry at the top of the stack, a ``IND`` token is generated, else if it consists of the same number of spaces, a ``SAD`` token is generated. If it consists of fewer spaces, a ``DED`` token is generated for any item on the stack that is greater than the -current. These items are then popped from the stack by the scanner. At the end +current. These items are later popped from the stack by the parser. At the end of the file, a ``DED`` token is generated for each number remaining on the stack that is larger than zero. Because the grammar contains some optional ``IND`` tokens, the scanner cannot push new indentation levels. This has to be done by the parser. The symbol ``indPush`` indicates that an ``IND`` token is expected; the current number of -leading spaces is pushed onto the stack by the parser. +leading spaces is pushed onto the stack by the parser. The symbol ``indPop`` +denotes that the parser pops an item from the indentation stack. No token is +consumed by ``indPop``. + Comments -------- @@ -131,8 +138,8 @@ aligned to the preceding one, it does not start a new comment: Comments are tokens; they are only allowed at certain places in the input file as they belong to the syntax tree! This feature enables perfect source-to-source transformations (such as pretty-printing) and superior documentation generators. -A side-effect is that the human reader of the code always knows exactly which -code snippet the comment refers to. +A nice side-effect is that the human reader of the code always knows exactly +which code snippet the comment refers to. Identifiers & Keywords @@ -159,9 +166,9 @@ case-sensitive and even underscores are ignored: **type** is a reserved word, and so is **TYPE** or **T_Y_P_E**. The idea behind this is that this allows programmers to use their own prefered spelling style and libraries written by different programmers cannot use incompatible -conventions. The editors or IDE can show the identifiers as preferred. Another -advantage is that it frees the programmer from remembering the exact spelling -of an identifier. +conventions. A Nimrod-aware editor or IDE can show the identifiers as +preferred. Another advantage is that it frees the programmer from remembering +the exact spelling of an identifier. Literal strings @@ -174,7 +181,7 @@ contain the following `escape sequences`:idx:\ : Escape sequence Meaning ================== =================================================== ``\n`` `newline`:idx: - ``\r`` `carriage return`:idx: + ``\r``, ``\c`` `carriage return`:idx: ``\l`` `line feed`:idx: ``\f`` `form feed`:idx: ``\t`` `tabulator`:idx: @@ -184,8 +191,7 @@ contain the following `escape sequences`:idx:\ : ``\'`` `apostrophe`:idx: ``\d+`` `character with decimal value d`:idx:; all decimal digits directly - following are used for the - character + following are used for the character ``\a`` `alert`:idx: ``\b`` `backspace`:idx: ``\e`` `escape`:idx: `[ESC]`:idx: @@ -194,15 +200,14 @@ contain the following `escape sequences`:idx:\ : ================== =================================================== -Strings in Nimrod may contain any 8-bit value, except embedded zeros -which are not allowed for compability with `C`:idx:. +Strings in Nimrod may contain any 8-bit value, except embedded zeros. Literal strings can also be delimited by three double squotes ``"""`` ... ``"""``. Literals in this form may run for several lines, may contain ``"`` and do not interpret any escape sequences. -For convenience, when the opening ``"""`` is immediately -followed by a newline, the newline is not included in the string. +For convenience, when the opening ``"""`` is immediately followed by a newline, +the newline is not included in the string. There are also `raw string literals` that are preceded with the letter ``r`` (or ``R``) and are delimited by matching double quotes (just like ordinary string literals) and do not interpret the escape sequences. This is especially @@ -253,8 +258,8 @@ Numerical constants As can be seen in the productions, numerical constants can contain unterscores for readability. Integer and floating point literals may be given in decimal (no -prefix), binary (prefix ``0b``), octal (prefix ``0o``) and -hexadecimal (prefix ``0x``) notation. +prefix), binary (prefix ``0b``), octal (prefix ``0o``) and hexadecimal +(prefix ``0x``) notation. There exists a literal for each numerical type that is defined. The suffix starting with an apostophe ('\'') is called a @@ -262,7 +267,7 @@ defined. The suffix starting with an apostophe ('\'') is called a unless the literal contains a dot or an ``E`` in which case it is of type ``float``. -The following table specifies type suffixes: +The type suffixes are: ================= ========================= Type Suffix Resulting type of literal @@ -295,11 +300,11 @@ the three tokens `{`:tok:, `..`:tok:, `}`:tok: and not the two tokens `{.`:tok:, `.}`:tok:. In Nimrod one can define his own operators. An `operator`:idx: is any -combination of the following characters that are not listed above:: +combination of the following characters that is not listed above:: + - * / < > = @ $ ~ & % - ! ? ^ . | + ! ? ^ . | \ These keywords are also operators: ``and or not xor shl shr div mod in notin is isnot``. @@ -348,16 +353,13 @@ Constants cannot change. The compiler must be able to evaluate the expression in a constant declaration at compile time. -.. - Nimrod contains a sophisticated - compile-time evaluator, so procedures declared with the ``{.noSideEffect.}`` - pragma can be used in constant expressions: +Nimrod contains a sophisticated compile-time evaluator, so procedures which +have no side-effect can be used in constant expressions too: - .. code-block:: nimrod - - from strutils import findSubStr - const - x = findSubStr('a', "hallo") # x is 1; this is computed at compile time! +.. code-block:: nimrod + import strutils + const + constEval = contains("abc", 'b') # computed at compile time! Types @@ -414,8 +416,8 @@ intXX There are no `unsigned integer`:idx: types, only `unsigned operations`:idx: that treat their arguments as unsigned. Unsigned operations all wrap around; -they may not lead to over- or underflow errors. Unsigned operations use the -``%`` postfix as convention: +they cannot lead to over- or underflow errors. Unsigned operations use the +``%`` suffix as convention: ====================== ====================================================== operation meaning @@ -453,7 +455,7 @@ floatXX implementation supports ``float32`` and ``float64``. Literals of these types have the suffix 'fXX. -`Automatic type conversion`:idx: is performed in expressions where different +`Automatic type conversion`:idx: is performed in expressions where different kinds of integer types are used. However, if the type conversion loses information, the `EOutOfRange`:idx: exception is raised (if the error cannot be detected at compile time). @@ -498,16 +500,15 @@ the resulting programs will still handle UTF-8 properly as UTF-8 was specially designed for this. Another reason is that Nimrod can support ``array[char, int]`` or ``set[char]`` efficiently as many algorithms rely on this feature. The -`TUniChar` type is used for Unicode characters, it can represent any Unicode -character. ``TUniChar`` is declared the ``unicode`` standard module. +`TRune` type is used for Unicode characters, it can represent any Unicode +character. ``TRune`` is declared the ``unicode`` module. Enumeration types ~~~~~~~~~~~~~~~~~ -`Enumeration`:idx: types define a new type whose values consist only of the ones -specified. -The values are ordered by the order in enum's declaration. Example: +`Enumeration`:idx: types define a new type whose values consist of the ones +specified. The values are ordered. Example: .. code-block:: nimrod @@ -528,8 +529,8 @@ with enumeration types. For better interfacing to other programming languages, the fields of enum types can be assigned an explicit ordinal value. However, the ordinal values -have to be in ascending order. A field whose ordinal value that is not -explicitly given, is assigned the value of the previous field + 1. +have to be in ascending order. A field whose ordinal value is not +explicitly given is assigned the value of the previous field + 1. An explicit ordered enum can have *wholes*: @@ -545,7 +546,7 @@ and ``pred`` are not available for them either. Subrange types ~~~~~~~~~~~~~~ -A `subrange`:idx: type is a range of values from an ordinal type (the host +A `subrange`:idx: type is a range of values from an ordinal type (the base type). To define a subrange type, one must specify it's limiting values: the highest and lowest value of the type: @@ -566,7 +567,7 @@ A subrange type has the same size as its base type (``int`` in the example). String type ~~~~~~~~~~~ All string literals are of the type `string`:idx:. A string in Nimrod is very -similar to a sequence of characters. However, strings in Nimrod both are +similar to a sequence of characters. However, strings in Nimrod are both zero-terminated and have a length field. One can retrieve the length with the builtin ``len`` procedure; the length never counts the terminating zero. The assignment operator for strings always copies the string. @@ -585,7 +586,7 @@ arrays, they can be used in case statements: Per convention, all strings are UTF-8 strings, but this is not enforced. For example, when reading strings from binary files, they are merely a sequence of bytes. The index operation ``s[i]`` means the i-th *char* of ``s``, not the -i-th *unichar*. The iterator ``unichars`` from the ``unicode`` standard +i-th *unichar*. The iterator ``runes`` from the ``unicode`` module can be used for iteration over all unicode characters. @@ -611,9 +612,7 @@ constructed by the array constructor ``[]`` in conjunction with the array to sequence operator ``@``. Another way to allocate space for a sequence is to call the built-in ``newSeq`` procedure. -A sequence may be passed to a parameter that is of type *open array*, but -not to a multi-dimensional open array, because it is impossible to do so in an -efficient manner. +A sequence may be passed to a parameter that is of type *open array*. Example: @@ -633,18 +632,36 @@ The lower bound of an array or sequence may be received by the built-in proc received by ``len()``. ``low()`` for a sequence or an open array always returns 0, as this is the first valid index. -The notation ``x[i]`` can be used to access the i-th element of ``x``. +The notation ``x[i]`` can be used to access the i-th element of ``x``. Arrays are always bounds checked (at compile-time or at runtime). These checks can be disabled via pragmas or invoking the compiler with the ``--bound_checks:off`` command line switch. +An open array is also a means to implement passing a variable number of +arguments to a procedure. The compiler converts the list of arguments +to an array automatically: + +.. code-block:: nimrod + proc myWriteln(f: TFile, a: openarray[string]) = + for s in items(a): + write(f, s) + write(f, "\n") + + myWriteln(stdout, "abc", "def", "xyz") + # is transformed by the compiler to: + myWriteln(stdout, ["abc", "def", "xyz"]) + +This transformation is only done if the openarray parameter is the +last parameter in the procedure header. The current implementation does not +support nested open arrays. + Tuples and object types ~~~~~~~~~~~~~~~~~~~~~~~ A variable of a `tuple`:idx: or `object`:idx: type is a heterogenous storage container. -A tuple or object defines various named *fields* of a type. A tuple also +A tuple or object defines various named *fields* of a type. A tuple also defines an *order* of the fields. Tuples are meant for heterogenous storage types with no overhead and few abstraction possibilities. The constructor ``()`` can be used to construct tuples. The order of the fields in the constructor @@ -691,7 +708,7 @@ the ``is`` operator can be used to determine the object's type. person: TPerson assert(student is TStudent) # is true -Object fields that should be visible outside from the defining module, have to +Object fields that should be visible from outside the defining module, have to marked by ``*``. In contrast to tuples, different object types are never *equivalent*. @@ -730,7 +747,7 @@ An example: new(n) # creates a new node n.kind = nkFloat n.floatVal = 0.0 # valid, because ``n.kind==nkFloat``, so that it fits - + # the following statement raises an `EInvalidField` exception, because # n.kind's value does not fit: n.strVal = "" @@ -783,8 +800,8 @@ point to and modify the same location in memory. Nimrod distinguishes between `traced`:idx: and `untraced`:idx: references. Untraced references are also called *pointers*. Traced references point to -objects of a garbage collected heap, untraced references point to -manually allocated objects or to objects somewhere else in memory. Thus +objects of a garbage collected heap, untraced references point to +manually allocated objects or to objects somewhere else in memory. Thus untraced references are *unsafe*. However for certain low-level operations (accessing the hardware) untraced references are unavoidable. @@ -817,7 +834,7 @@ To deal with untraced memory, the procedures ``alloc``, ``dealloc`` and ``realloc`` can be used. The documentation of the system module contains further information. -If a reference points to *nothing*, it has the value ``nil``. +If a reference points to *nothing*, it has the value ``nil``. Special care has to be taken if an untraced object contains traced objects like traced references, strings or sequences: In order to free everything properly, @@ -904,9 +921,9 @@ Most calling conventions exist only for the Windows 32-bit platform. -Statements ----------- -Nimrod uses the common statement/expression paradigma: `Statements`:idx: do not +Statements and expressions +-------------------------- +Nimrod uses the common statement/expression paradigm: `Statements`:idx: do not produce a value in contrast to expressions. Call expressions are statements. If the called procedure returns a value, it is not a valid statement as statements do not produce values. To evaluate an expression for @@ -943,7 +960,7 @@ Discard statement Syntax:: - discardStmt ::= DISCARD expr + discardStmt ::= 'discard' expr Example: @@ -962,11 +979,13 @@ Var statement Syntax:: - colonOrEquals ::= COLON typeDesc [EQUALS expr] | EQUALS expr - varField ::= symbol ["*"] [pragma] + colonOrEquals ::= ':' typeDesc ['=' expr] | '=' expr + varField ::= symbol ['*'] [pragma] varPart ::= symbol (comma symbol)* [comma] colonOrEquals [COMMENT | IND COMMENT] - varSection ::= VAR (varPart - | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED) + varSection ::= 'var' (varPart + | indPush (COMMENT|varPart) + (SAD (COMMENT|varPart))* DED indPop) + `Var`:idx: statements declare new local and global variables and initialize them. A comma seperated list of variables can be used to specify @@ -992,7 +1011,7 @@ char '\0' bool false ref or pointer type nil procedural type nil -sequence nil +sequence nil (**not** ``@[]``) string nil (**not** "") tuple[x: A, y: B, ...] (default(A), default(B), ...) (analogous for objects) @@ -1007,12 +1026,12 @@ Const section Syntax:: - colonAndEquals ::= [COLON typeDesc] EQUALS expr - constDecl ::= CONST - indPush - symbol ["*"] [pragma] colonAndEquals - (SAD symbol ["*"] [pragma] colonAndEquals)* - DED + colonAndEquals ::= [':' typeDesc] '=' expr + + constDecl ::= symbol ['*'] [pragma] colonAndEquals [COMMENT | IND COMMENT] + | COMMENT + constSection ::= 'const' indPush constDecl (SAD constDecl)* DED indPop + Example: @@ -1031,7 +1050,7 @@ If statement Syntax:: - ifStmt ::= IF expr COLON stmt (ELIF expr COLON stmt)* [ELSE COLON stmt] + ifStmt ::= 'if' expr ':' stmt ('elif' expr ':' stmt)* ['else' ':' stmt] Example: @@ -1061,9 +1080,9 @@ Case statement Syntax:: - caseStmt ::= CASE expr (OF sliceList COLON stmt)* - (ELIF expr COLON stmt)* - [ELSE COLON stmt] + caseStmt ::= 'case' expr ('of' sliceExprList ':' stmt)* + ('elif' expr ':' stmt)* + ['else' ':' stmt] Example: @@ -1078,9 +1097,9 @@ Example: The `case`:idx: statement is similar to the if statement, but it represents a multi-branch selection. The expression after the keyword ``case`` is evaluated and if its value is in a *vallist* the corresponding statements -(after the ``of`` keyword) are executed. If the value is not in any -given *slicelist* the ``else`` part is executed. If there is no ``else`` -part and not all possible values that ``expr`` can hold occur in a ``vallist``, +(after the ``of`` keyword) are executed. If the value is not in any +given *slicelist* the ``else`` part is executed. If there is no ``else`` +part and not all possible values that ``expr`` can hold occur in a ``vallist``, a static error is given. This holds only for expressions of ordinal types. If the expression is not of an ordinal type, and no ``else`` part is given, control just passes after the ``case`` statement. @@ -1094,7 +1113,7 @@ When statement Syntax:: - whenStmt ::= WHEN expr COLON stmt (ELIF expr COLON stmt)* [ELSE COLON stmt] + whenStmt ::= 'when' expr ':' stmt ('elif' expr ':' stmt)* ['else' ':' stmt] Example: @@ -1116,8 +1135,7 @@ exceptions: * The statements do not open a new scope if they introduce new identifiers. * The statements that belong to the expression that evaluated to true are translated by the compiler, the other statements are not checked for - syntax or semantics at all! This holds also for any ``expr`` coming - after the expression that evaluated to true. + semantics! However, each ``expr`` is checked for semantics. The ``when`` statement enables conditional compilation techniques. As a special syntatic extension, the ``when`` construct is also available @@ -1129,7 +1147,7 @@ Raise statement Syntax:: - raiseStmt ::= RAISE [expr] + raiseStmt ::= 'raise' [expr] Example: @@ -1137,7 +1155,7 @@ Example: raise newEOS("operating system failed") Apart from built-in operations like array indexing, memory allocation, etc. -the ``raise`` statement is the only way to raise an exception. +the ``raise`` statement is the only way to raise an exception. .. XXX document this better! @@ -1152,11 +1170,11 @@ Try statement Syntax:: + qualifiedIdent ::= symbol ['.' symbol] exceptList ::= [qualifiedIdent (comma qualifiedIdent)* [comma]] - tryStmt ::= TRY COLON stmt - (EXCEPT exceptList COLON stmt)* - [FINALLY COLON stmt] - + tryStmt ::= 'try' ':' stmt + ('except' exceptList ':' stmt)* + ['finally' ':' stmt] Example: @@ -1176,6 +1194,8 @@ Example: echo("could not convert string to integer") except EIO: echo("IO error!") + except: + echo("Unknown exception!") finally: closeFile(f) @@ -1203,7 +1223,7 @@ Return statement Syntax:: - returnStmt ::= RETURN [expr] + returnStmt ::= 'return' [expr] Example: @@ -1219,12 +1239,13 @@ sugar for: return result ``return`` without an expression is a short notation for ``return result`` if -the proc has a return type. The `result`:idx: variable is always the return +the proc has a return type. The `result`:idx: variable is always the return value of the procedure. It is automatically declared by the compiler. As all variables, ``result`` is initialized to (binary) zero:: .. code-block:: nimrod - proc returnZero(): int = nil # implicitely returns 0 + proc returnZero(): int = + # implicitely returns 0 Yield statement @@ -1232,7 +1253,7 @@ Yield statement Syntax:: - yieldStmt ::= YIELD expr + yieldStmt ::= 'yield' expr Example: @@ -1252,7 +1273,7 @@ Block statement Syntax:: - blockStmt ::= BLOCK [symbol] COLON stmt + blockStmt ::= 'block' [symbol] ':' stmt Example: @@ -1277,7 +1298,7 @@ Break statement Syntax:: - breakStmt ::= BREAK [symbol] + breakStmt ::= 'break' [symbol] Example: @@ -1294,7 +1315,7 @@ While statement Syntax:: - whileStmt ::= WHILE expr COLON stmt + whileStmt ::= 'while' expr ':' stmt Example: @@ -1316,7 +1337,7 @@ Continue statement Syntax:: - continueStmt ::= CONTINUE + continueStmt ::= 'continue' A `continue`:idx: statement leads to the immediate next iteration of the surrounding loop construct. It is only allowed within a loop. A continue @@ -1340,7 +1361,7 @@ Assembler statement ~~~~~~~~~~~~~~~~~~~ Syntax:: - asmStmt ::= ASM [pragma] (STR_LIT | RSTR_LIT | TRIPLESTR_LIT) + asmStmt ::= 'asm' [pragma] (STR_LIT | RSTR_LIT | TRIPLESTR_LIT) The direct embedding of `assembler`:idx: code into Nimrod code is supported by the unsafe ``asm`` statement. Identifiers in the assembler code that refer to @@ -1348,6 +1369,49 @@ Nimrod identifiers shall be enclosed in a special character which can be specified in the statement's pragmas. The default special character is ``'`'``. +If expression +~~~~~~~~~~~~~ + +An `if expression` is almost like an if statement, but it is an expression. +Example: + +.. code-block:: nimrod + p(if x > 8: 9 else: 10) + +An if expression always results in a value, so the ``else`` part is +required. ``Elif`` parts are also allowed (but unlikely to be good +style). + + +Type convertions +~~~~~~~~~~~~~~~~ +Syntactically a `type conversion` is like a procedure call, but a +type name replaces the procedure name. A type conversion is always +safe in the sense that a failure to convert a type to another +results in an exception (if it cannot be determined statically). + + +Type casts +~~~~~~~~~~ +Example: + +.. code-block:: nimrod + cast[int](x) + +Type casts are a crude mechanism to interpret the bit pattern of +an expression as if it would be of another type. Type casts are +only needed for low-level programming and are inherently unsafe. + + +The addr operator +~~~~~~~~~~~~~~~~~ +The `addr` operator returns the address of an l-value. If the +type of the location is ``T``, the `addr` operator result is +of the type ``ptr T``. Taking the address of an object that resides +on the stack is **unsafe**, as the pointer may live longer than the +object on the stack and can thus reference a non-existing object. + + Procedures ~~~~~~~~~~ What most programming languages call `methods`:idx: or `funtions`:idx: are @@ -1355,16 +1419,16 @@ called `procedures`:idx: in Nimrod (which is the correct terminology). A procedure declaration defines an identifier and associates it with a block of code. A procedure may call itself recursively. The syntax is:: - param ::= symbol (comma symbol)* [comma] COLON typeDesc - paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc] - - genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI - - procDecl ::= PROC symbol ["*"] [genericParams] - paramList [pragma] - [EQUALS stmt] - -If the ``EQUALS stmt`` part is missing, it is a `forward`:idx: declaration. If + param ::= symbol (comma symbol)* [comma] ':' typeDesc + paramList ::= ['(' [param (comma param)* [comma]] ')'] [':' typeDesc] + + genericParam ::= symbol [':' typeDesc] + genericParams ::= '[' genericParam (comma genericParam)* [comma] ']' + + procDecl ::= 'proc' symbol ['*'] [genericParams] paramList [pragma] + ['=' stmt] + +If the ``= stmt`` part is missing, it is a `forward`:idx: declaration. If the proc returns a value, the procedure body can access an implicit declared variable named `result`:idx: that represents the return value. Procs can be overloaded. The overloading resolution algorithm tries to find the proc that is @@ -1384,6 +1448,24 @@ is used if the caller does not provide a value for this parameter. Example: for i in 0..len(s) - 1: result[i] = toLower(s[i]) # calls toLower for characters; no recursion! +Calling a procedure can be done in many different ways: + +.. code-block:: nimrod + proc callme(x, y: int, s: string = "", c: char, b: bool = false) = ... + + # call with positional arguments # parameter bindings: + callme(0, 1, "abc", '\t', true) # (x=0, y=1, s="abc", c='\t', b=true) + # call with named and positional arguments: + callme(y=1, x=0, "abd", '\t') # (x=0, y=1, s="abd", c='\t', b=false) + # call with named arguments (order is not relevant): + callme(c='\t', y=1, x=0) # (x=0, y=1, s="", c='\t', b=false) + # call as a command statement: no () needed: + callme 0, 1, "abc", '\t' + + +A procedure cannot modify its parameters (unless the parameters have the +type `var`). + `Operators`:idx: are procedures with a special operator symbol as identifier: .. code-block:: nimrod @@ -1391,19 +1473,79 @@ is used if the caller does not provide a value for this parameter. Example: # converts an integer to a string; this is a prefix operator. return intToStr(x) -Calling a procedure can be done in many different ways: +Operators with one parameter are prefix operators, operators with two +parameters are infix operators. There is no way to declare postfix +operators: All postfix operators are built-in and handled by the +grammar explicitely. + +Any operator can be called like an ordinary proc with the '`opr`' +notation. (Thus an operator can have more than two parameters): .. code-block:: nimrod - proc callme(x, y: int, s: string = "", c: char, b: bool = false) = ... + proc `*+` (a, b, c: int): int = + # Multiply and add + return a * b + c + + assert `*+`(3, 4, 6) == `*`(a, `+`(b, c)) + + + +Var parameters +~~~~~~~~~~~~~~ +The type of a parameter may be prefixed with the ``var`` keyword: + +.. code-block:: nimrod + proc divmod(a, b: int, res, remainder: var int) = + res = a div b + remainder = a mod b + + var + x, y: int + + divmod(8, 5, x, y) # modifies x and y + assert x == 1 + assert y == 3 + +In the example, ``res`` and ``remainder`` are `var parameters`. +Var parameters can be modified by the procedure and the changes are +visible to the caller. The argument passed to a var parameter has to be +an l-value. Var parameters are implemented as hidden pointers. The +above example is equivalent to: + +.. code-block:: nimrod + proc divmod(a, b: int, res, remainder: ptr int) = + res = a div b + remainder = a mod b + + var + x, y: int + divmod(8, 5, addr(x), addr(y)) + assert x == 1 + assert y == 3 + +In the examples, var parameters or pointers are used to provide two +return values. This can be done in a cleaner way by returning a tuple: + +.. code-block:: nimrod + proc divmod(a, b: int): tuple[res, remainder: int] = + return (a div b, a mod b) + + var t = divmod(8, 5) + assert t.res == 1 + assert t.remainder = 3 + +Even more elegant is to use `tuple unpacking` to access the tuple's fields: + +.. code-block:: nimrod + var (x, y) = divmod(8, 5) # tuple unpacking + assert x == 1 + assert y == 3 + +Unfortunately, this form of tuple unpacking is not yet implemented. + +.. + XXX remove this as soon as tuple unpacking is implemented - # call with positional arguments# parameter bindings: - callme(0, 1, "abc", '\t', true) # (x=0, y=1, s="abc", c='\t', b=true) - # call with named and positional arguments: - callme(y=1, x=0, "abd", '\t') # (x=0, y=1, s="abd", c='\t', b=false) - # call with named arguments (order is not relevant): - callme(c='\t', y=1, x=0) # (x=0, y=1, s="", c='\t', b=false) - # call as a command statement: no () needed: - callme 0, 1, "abc", '\t' Iterators and the for statement @@ -1411,15 +1553,16 @@ Iterators and the for statement Syntax:: - forStmt ::= FOR symbol (comma symbol)* [comma] IN expr [DOTDOT expr] COLON stmt + forStmt ::= 'for' symbol (comma symbol)* [comma] 'in' expr ['..' expr] ':' stmt - param ::= symbol (comma symbol)* [comma] COLON typeDesc - paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc] - - genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI - - iteratorDecl ::= ITERATOR symbol ["*"] [genericParams] paramList [pragma] - [EQUALS stmt] + param ::= symbol (comma symbol)* [comma] ':' typeDesc + paramList ::= ['(' [param (comma param)* [comma]] ')'] [':' typeDesc] + + genericParam ::= symbol [':' typeDesc] + genericParams ::= '[' genericParam (comma genericParam)* [comma] ']' + + iteratorDecl ::= 'iterator' symbol ['*'] [genericParams] paramList [pragma] + ['=' stmt] The `for`:idx: statement is an abstract mechanism to iterate over the elements of a container. It relies on an `iterator`:idx: to do so. Like ``while`` @@ -1473,13 +1616,15 @@ Type sections Syntax:: typeDef ::= typeDesc | objectDef | enumDef - genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI - typeDecl ::= TYPE - indPush - symbol ["*"] [genericParams] [EQUALS typeDef] - (SAD symbol ["*"] [genericParams] [EQUALS typeDef])* - DED + genericParam ::= symbol [':' typeDesc] + genericParams ::= '[' genericParam (comma genericParam)* [comma] ']' + + typeDecl ::= COMMENT + | symbol ['*'] [genericParams] ['=' typeDef] [COMMENT|IND COMMENT] + + typeSection ::= 'type' indPush typeDecl (SAD typeDecl)* DED indPop + Example: @@ -1504,6 +1649,8 @@ possible within a single ``type`` section. Generics ~~~~~~~~ +`Version 0.7.4: Complex generic types like in the example do not work.`:red: + Example: .. code-block:: nimrod @@ -1578,26 +1725,119 @@ Example: # this definition exists in the System module not (a == b) - writeln(5 != 6) # the compiler rewrites that to: writeln(not (5 == 6)) + assert(5 != 6) # the compiler rewrites that to: assert(not (5 == 6)) Macros -~~~~~~ +------ -`Macros`:idx: are the most powerful feature of Nimrod. They should be used -only to implement `domain specific languages`:idx:. They may lead to code +`Macros`:idx: are the most powerful feature of Nimrod. They can be used +to implement `domain specific languages`:idx:. But they may lead to code that is harder to understand and maintain. So one ought to use them sparingly. -The usage of ordinary procs, iterators or generics is preferred to the usage of -macros. + +While macros enable advanced compile-time code tranformations, they +cannot change Nimrod's syntax. However, this is no real restriction because +Nimrod's syntax is flexible enough anyway. + +To write macros, one needs to know how the Nimrod concrete syntax is converted +to an abstract syntax tree. (Unfortunately the AST is not yet documented.) + +There are two ways to invoke a macro: +(1) invoking a macro like a procedure call (`expression macros`) +(2) invoking a macro with the special ``macrostmt`` syntax (`statement macros`) + + +Expression Macros +~~~~~~~~~~~~~~~~~ + +The following example implements a powerful ``debug`` command that accepts a +variable number of arguments: + +.. code-block:: nimrod + # to work with Nimrod syntax trees, we need an API that is defined in the + # ``macros`` module: + import macros + + macro debug(n: expr): stmt = + # `n` is a Nimrod AST that contains the whole macro expression + # this macro returns a list of statements: + result = newNimNode(nnkStmtList, n) + # iterate over any argument that is passed to this macro: + for i in 1..n.len-1: + # add a call to the statement list that writes the expression; + # `toStrLit` converts an AST to its string representation: + add(result, newCall("write", newIdentNode("stdout"), toStrLit(n[i]))) + # add a call to the statement list that writes ": " + add(result, newCall("write", newIdentNode("stdout"), newStrLitNode(": "))) + # add a call to the statement list that writes the expressions value: + add(result, newCall("writeln", newIdentNode("stdout"), n[i])) + + var + a: array [0..10, int] + x = "some string" + a[0] = 42 + a[1] = 45 + + debug(a[0], a[1], x) + +The macro call expands to: + +.. code-block:: nimrod + write(stdout, "a[0]") + write(stdout, ": ") + writeln(stdout, a[0]) + + write(stdout, "a[1]") + write(stdout, ": ") + writeln(stdout, a[1]) + + write(stdout, "x") + write(stdout, ": ") + writeln(stdout, x) + + +Statement Macros +~~~~~~~~~~~~~~~~ + +Statement macros are defined just as expression macros. However, they are +invoked by an expression following a colon:: + + exprStmt ::= lowestExpr ['=' expr | [expr (comma expr)* [comma]] [macroStmt]] + macroStmt ::= ':' [stmt] ('of' [sliceExprList] ':' stmt + | 'elif' expr ':' stmt + | 'except' exceptList ':' stmt )* + ['else' ':' stmt] + +The following example outlines a macro that generates a lexical analyser from +regular expressions: + +.. code-block:: nimrod + import macros + + macro case_token(n: stmt): stmt = + # creates a lexical analyser from regular expressions + # ... (implementation is an exercise for the reader :-) + nil + + case_token: # this colon tells the parser it is a macro statement + of r"[A-Za-z_]+[A-Za-z_0-9]*": + return tkIdentifier + of r"0-9+": + return tkInteger + of r"[\+\-\*\?]+": + return tkOperator + else: + return tkUnknown + Modules ------- Nimrod supports splitting a program into pieces by a `module`:idx: concept. -Each module needs to be in its own file. Modules enable +Each module needs to be in its own file. Modules enable `information hiding`:idx: and `separate compilation`:idx:. A module may gain -access to symbols of another module by the `import`:idx: statement. -`Recursive module dependancies`:idx: are allowed, but slightly subtle. Only +access to symbols of another module by the `import`:idx: statement. +`Recursive module dependancies`:idx: are allowed, but slightly subtle. Only top-level symbols that are marked with an asterisk (``*``) are exported. The algorithm for compiling modules is: @@ -1622,12 +1862,12 @@ This is best illustrated by an example: # Module B import A # A is not parsed here! Only the already known symbols - # of A are imported here. + # of A are imported. - proc p*(x: A.T1): A.T1 # this works because the compiler has already - # added T1 to A's interface symbol table - - proc p(x: A.T1): A.T1 = return x + 1 + proc p*(x: A.T1): A.T1 = + # this works because the compiler has already + # added T1 to A's interface symbol table + return x + 1 Scope rules @@ -1649,7 +1889,7 @@ procedure or iterator overloading purposes. Tuple or object scope -~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~ The field identifiers inside a tuple or object definition are valid in the following places: @@ -1659,16 +1899,14 @@ following places: Module scope ~~~~~~~~~~~~ -All identifiers in the interface part of a module are valid from the point of -declaration, until the end of the module. Furthermore, the identifiers are -known in other modules that import the module. Identifiers from indirectly -dependent modules are *not* available. The `system`:idx: module is automatically -imported in all other modules. +All identifiers of a module are valid from the point of declaration until +the end of the module. Identifiers from indirectly dependent modules are *not* +available. The `system`:idx: module is automatically imported in every other +module. -If a module imports an identifier by two different modules, -each occurance of the identifier has to be qualified, unless it is an -overloaded procedure or iterator in which case the overloading -resolution takes place: +If a module imports an identifier by two different modules, each occurance of +the identifier has to be qualified, unless it is an overloaded procedure or +iterator in which case the overloading resolution takes place: .. code-block:: nimrod # Module A @@ -1680,7 +1918,7 @@ resolution takes place: # Module C import A, B write(stdout, x) # error: x is ambigious - write(sdtout, A.x) # no error: qualifier used + write(stdout, A.x) # no error: qualifier used var x = 4 write(stdout, x) # not ambigious: uses the module C's x @@ -1698,14 +1936,14 @@ Pragmas Syntax:: - colonExpr ::= expr [COLON expr] - colonExprList ::= [ colonExpr (comma colonExpr)* [comma] ] + colonExpr ::= expr [':' expr] + colonExprList ::= [colonExpr (comma colonExpr)* [comma]] - pragma ::= CURLYDOT_LE colonExprList (CURLYDOT_RI | CURLY_RI) + pragma ::= '{.' optInd (colonExpr [comma])* [SAD] ('.}' | '}') Pragmas are Nimrod's method to give the compiler additional information/ commands without introducing a massive number of new keywords. Pragmas are -processed on the fly during parsing. Pragmas are always enclosed in the +processed on the fly during semantic checking. Pragmas are enclosed in the special ``{.`` and ``.}`` curly brackets. @@ -1718,7 +1956,7 @@ The compiler defines the target processor and the target operating system as conditional symbols. Warning: The ``define`` pragma is deprecated as it conflicts with separate -compilation! One should use boolean constants as a replacement - this is +compilation! One should use boolean constants as a replacement - this is cleaner anyway. @@ -1759,10 +1997,6 @@ compilation option pragmas -------------------------- The listed pragmas here can be used to override the code generation options for a section of code. -:: - - "{." pragma: val {pragma: val} ".}" - The implementation currently provides the following possible options (later various others may be added). @@ -1785,8 +2019,7 @@ warnings on|off Turns the warning messages of the compiler hints on|off Turns the hint messages of the compiler on or off. optimization none|speed|size Optimize the code for speed or size, or - disable optimization. For non-optimizing - compilers this option has no effect. + disable optimization. callconv cdecl|... Specifies the default calling convention for all procedures (and procedure types) that follow. diff --git a/doc/nimrodc.txt b/doc/nimrodc.txt index 0bd9bdc91..18f9bce5d 100644 --- a/doc/nimrodc.txt +++ b/doc/nimrodc.txt @@ -12,7 +12,7 @@ Introduction This document describes the usage of the *Nimrod compiler* on the different supported platforms. It is not a definition of the Nimrod -programming system (therefore is the Nimrod manual). +programming language (therefore is the manual). Nimrod is free software; it is licensed under the `GNU General Public License `_. @@ -41,7 +41,7 @@ looks for it in the following directories (in this order): 2. ``$nimrod/config/nimrod.cfg`` (UNIX, Windows) 3. ``/etc/nimrod.cfg`` (UNIX) -The search stops as soon as a configuration file has been found. The reading +The search stops as soon as a configuration file has been found. The reading of ``nimrod.cfg`` can be suppressed by the ``--skip_cfg`` command line option. Configuration settings can be overwritten in a project specific configuration file that is read automatically. This specific file has to @@ -54,21 +54,13 @@ Command line settings have priority over configuration file settings. Nimrod's directory structure ---------------------------- The generated files that Nimrod produces all go into a subdirectory called -``nimcache`` in your project directory. This makes it easy to delete all +``nimcache`` in your project directory. This makes it easy to delete all generated files. However, the generated C code is not platform independant. C code generated for Linux does not compile on Windows, for instance. The comment on top of the C file lists the OS, CPU and CC the file has been compiled for. -The library lies in ``lib``. Directly in the library directory are essential -Nimrod modules like the ``system`` and ``os`` modules. Under ``lib/base`` -are additional specialized libraries or interfaces to foreign libraries which -are included in the standard distribution. The ``lib/extra`` directory is -initially empty. Third party libraries should go there. In the default -configuration the compiler always searches for libraries in ``lib``, -``lib/base`` and ``lib/extra``. - Additional Features =================== @@ -86,8 +78,8 @@ available. Importc Pragma ~~~~~~~~~~~~~~ The `importc`:idx: pragma provides a means to import a type, a variable, or a -procedure from C. The optional argument is a string containing the C -identifier. If the argument is missing, the C name is the Nimrod +procedure from C. The optional argument is a string containing the C +identifier. If the argument is missing, the C name is the Nimrod identifier *exactly as spelled*: .. code-block:: @@ -97,8 +89,8 @@ identifier *exactly as spelled*: Exportc Pragma ~~~~~~~~~~~~~~ The `exportc`:idx: pragma provides a means to export a type, a variable, or a -procedure to C. The optional argument is a string containing the C -identifier. If the argument is missing, the C name is the Nimrod +procedure to C. The optional argument is a string containing the C +identifier. If the argument is missing, the C name is the Nimrod identifier *exactly as spelled*: .. code-block:: Nimrod @@ -109,7 +101,7 @@ Dynlib Pragma ~~~~~~~~~~~~~ With the `dynlib`:idx: pragma a procedure or a variable can be imported from a dynamic library (``.dll`` files for Windows, ``lib*.so`` files for UNIX). The -non-optional argument has to be the name of the dynamic library: +non-optional argument has to be the name of the dynamic library: .. code-block:: Nimrod proc gtk_image_new(): PGtkWidget {.cdecl, dynlib: "libgtk-x11-2.0.so", importc.} @@ -128,8 +120,8 @@ the C code. Thus it makes the following possible, for example: .. code-block:: Nimrod var - EOF {.importc: "EOF", no_decl.}: cint # pretend EOF was a variable, as - # Nimrod does not know its value + EACCES {.importc, no_decl.}: cint # pretend EACCES was a variable, as + # Nimrod does not know its value However, the ``header`` pragma is often the better alternative. @@ -164,14 +156,6 @@ strings automatically: printf("hallo %s", "world") # "world" will be passed as C string -No_static Pragma -~~~~~~~~~~~~~~~~ -The `no_static`:idx: pragma can be applied to almost any symbol and specifies -that it shall not be declared ``static`` in the generated C code. Note that -symbols in the interface part of a module never get declared ``static``, so -only in very special cases this pragma is necessary. - - Line_dir Option ~~~~~~~~~~~~~~~ The `line_dir`:idx: option can be turned on or off. If on the generated C code @@ -216,14 +200,14 @@ The `register`:idx: pragma is for variables only. It declares the variable as in a hardware register for faster access. C compilers usually ignore this though and for good reason: Often they do a better job without it anyway. -In highly specific cases (a dispatch loop of an bytecode interpreter for +In highly specific cases (a dispatch loop of an bytecode interpreter for example) it may provide benefits, though. Acyclic Pragma ~~~~~~~~~~~~~~ The `acyclic`:idx: pragma can be used for object types to mark them as acyclic -even though they seem to be cyclic. This is an **optimization** for the garbage +even though they seem to be cyclic. This is an **optimization** for the garbage collector to not consider objects of this type as part of a cycle:: type @@ -231,15 +215,31 @@ collector to not consider objects of this type as part of a cycle:: TNode {.acyclic, final.} = object left, right: PNode data: string - + In the example a tree structure is declared with the ``TNode`` type. Note that -the type definition is recursive thus the GC has to assume that objects of -this type may form a cyclic graph. The ``acyclic`` pragma passes the +the type definition is recursive thus the GC has to assume that objects of +this type may form a cyclic graph. The ``acyclic`` pragma passes the information that this cannot happen to the GC. If the programmer uses the ``acyclic`` pragma for data types that are in reality cyclic, the GC may leak memory, but nothing worse happens. +Dead_code_elim Pragma +~~~~~~~~~~~~~~~~~~~~~ +The `dead_code_elim`:idx: pragma only applies to whole modules: It tells the +compiler to active (or deactivate) dead code elimination for the module the +pragma appers in. + +The ``--dead_code_elim:on`` command line switch has the same effect as marking +any module with ``{.dead_code_elim:on}``. However, for some modules such as +the GTK wrapper it makes sense to *always* turn on dead code elimination - +no matter if it is globally active or not. + +Example: + +.. code-block:: nimrod + {.dead_code_elim: on.} + Disabling certain messages -------------------------- @@ -280,8 +280,8 @@ However, sometimes one has to optimize. Do it in the following order: This section can only help you with the last item. Note that rewriting parts of your program in C is *never* necessary to speed up your program, because -everything that can be done in C can be done in Nimrod. Rewriting parts in -assembler *might*. +everything that can be done in C can be done in Nimrod. + Optimizing string handling -------------------------- diff --git a/doc/rst.txt b/doc/rst.txt index c4f3805b3..79d0eb9c4 100644 --- a/doc/rst.txt +++ b/doc/rst.txt @@ -18,8 +18,7 @@ compatible to the original implementation as one would like. Even though Nimrod's |rst| parser does not parse all constructs, it is pretty usable. The missing features can easily be circumvented. An indication of this -fact is that Nimrod's -*whole* documentation itself (including this document) is +fact is that Nimrod's *whole* documentation itself (including this document) is processed by Nimrod's |rst| parser. (Which is an order of magnitude faster than Docutils' parser.) diff --git a/doc/theindex.txt b/doc/theindex.txt index f60e85d28..1afbdb791 100644 --- a/doc/theindex.txt +++ b/doc/theindex.txt @@ -1,7469 +1,7539 @@ - -===== -Index -===== - -.. index:: - - - `!=`:idx: - `system.html#351 `_ - - `$`:idx: - * `system.html#420 `_ - * `system.html#421 `_ - * `system.html#422 `_ - * `system.html#423 `_ - * `system.html#424 `_ - * `system.html#425 `_ - * `system.html#426 `_ - * `times.html#109 `_ - * `times.html#110 `_ - - `%`:idx: - * `strutils.html#132 `_ - * `strutils.html#133 `_ - * `strtabs.html#112 `_ - - `%%`:idx: - * `system.html#293 `_ - * `system.html#294 `_ - * `system.html#295 `_ - * `system.html#296 `_ - * `system.html#297 `_ - - `&`:idx: - * `system.html#362 `_ - * `system.html#363 `_ - * `system.html#364 `_ - * `system.html#365 `_ - * `system.html#450 `_ - * `system.html#451 `_ - * `system.html#452 `_ - * `system.html#453 `_ - - `*`:idx: - * `system.html#203 `_ - * `system.html#204 `_ - * `system.html#205 `_ - * `system.html#206 `_ - * `system.html#207 `_ - * `system.html#312 `_ - * `system.html#323 `_ - * `complex.html#107 `_ - - `*%`:idx: - * `system.html#283 `_ - * `system.html#284 `_ - * `system.html#285 `_ - * `system.html#286 `_ - * `system.html#287 `_ - - `+`:idx: - * `system.html#178 `_ - * `system.html#179 `_ - * `system.html#180 `_ - * `system.html#181 `_ - * `system.html#182 `_ - * `system.html#193 `_ - * `system.html#194 `_ - * `system.html#195 `_ - * `system.html#196 `_ - * `system.html#197 `_ - * `system.html#308 `_ - * `system.html#310 `_ - * `system.html#324 `_ - * `complex.html#103 `_ - - `+%`:idx: - * `system.html#273 `_ - * `system.html#274 `_ - * `system.html#275 `_ - * `system.html#276 `_ - * `system.html#277 `_ - - `-`:idx: - * `system.html#183 `_ - * `system.html#184 `_ - * `system.html#185 `_ - * `system.html#186 `_ - * `system.html#187 `_ - * `system.html#198 `_ - * `system.html#199 `_ - * `system.html#200 `_ - * `system.html#201 `_ - * `system.html#202 `_ - * `system.html#309 `_ - * `system.html#311 `_ - * `system.html#325 `_ - * `complex.html#104 `_ - * `complex.html#105 `_ - * `times.html#113 `_ - - `-%`:idx: - * `system.html#278 `_ - * `system.html#279 `_ - * `system.html#280 `_ - * `system.html#281 `_ - * `system.html#282 `_ - - `-+-`:idx: - `system.html#326 `_ - - `/`:idx: - * `system.html#313 `_ - * `os.html#119 `_ - * `complex.html#106 `_ - - `/%`:idx: - * `system.html#288 `_ - * `system.html#289 `_ - * `system.html#290 `_ - * `system.html#291 `_ - * `system.html#292 `_ - - `/../`:idx: - `os.html#123 `_ - - `<`:idx: - * `system.html#253 `_ - * `system.html#254 `_ - * `system.html#255 `_ - * `system.html#256 `_ - * `system.html#257 `_ - * `system.html#316 `_ - * `system.html#343 `_ - * `system.html#344 `_ - * `system.html#345 `_ - * `system.html#346 `_ - * `system.html#347 `_ - * `system.html#348 `_ - * `system.html#349 `_ - * `system.html#350 `_ - * `times.html#114 `_ - - `<%`:idx: - * `system.html#303 `_ - * `system.html#304 `_ - * `system.html#305 `_ - * `system.html#306 `_ - * `system.html#307 `_ - - `<=`:idx: - `times.html#115 `_ - - `<=`:idx: - * `system.html#248 `_ - * `system.html#249 `_ - * `system.html#250 `_ - * `system.html#251 `_ - * `system.html#252 `_ - * `system.html#315 `_ - * `system.html#336 `_ - * `system.html#337 `_ - * `system.html#338 `_ - * `system.html#339 `_ - * `system.html#340 `_ - * `system.html#341 `_ - * `system.html#342 `_ - - `<=%`:idx: - * `system.html#298 `_ - * `system.html#299 `_ - * `system.html#300 `_ - * `system.html#301 `_ - * `system.html#302 `_ - - `==`:idx: - * `system.html#243 `_ - * `system.html#244 `_ - * `system.html#245 `_ - * `system.html#246 `_ - * `system.html#247 `_ - * `system.html#314 `_ - * `system.html#327 `_ - * `system.html#328 `_ - * `system.html#329 `_ - * `system.html#330 `_ - * `system.html#331 `_ - * `system.html#332 `_ - * `system.html#333 `_ - * `system.html#334 `_ - * `system.html#335 `_ - * `system.html#455 `_ - * `complex.html#102 `_ - - `>`:idx: - `system.html#353 `_ - - `>%`:idx: - `system.html#419 `_ - - `>=`:idx: - `system.html#352 `_ - - `>=%`:idx: - `system.html#418 `_ - - `@`:idx: - `system.html#361 `_ - - `[]`:idx: - `strtabs.html#107 `_ - - `[]=`:idx: - `strtabs.html#106 `_ - - `[ESC]`:idx: - `manual.html#134 `_ - - `ABDAY_1`:idx: - `posix.html#403 `_ - - `ABDAY_2`:idx: - `posix.html#404 `_ - - `ABDAY_3`:idx: - `posix.html#405 `_ - - `ABDAY_4`:idx: - `posix.html#406 `_ - - `ABDAY_5`:idx: - `posix.html#407 `_ - - `ABDAY_6`:idx: - `posix.html#408 `_ - - `ABDAY_7`:idx: - `posix.html#409 `_ - - `ABMON_1`:idx: - `posix.html#422 `_ - - `ABMON_10`:idx: - `posix.html#431 `_ - - `ABMON_11`:idx: - `posix.html#432 `_ - - `ABMON_12`:idx: - `posix.html#433 `_ - - `ABMON_2`:idx: - `posix.html#423 `_ - - `ABMON_3`:idx: - `posix.html#424 `_ - - `ABMON_4`:idx: - `posix.html#425 `_ - - `ABMON_5`:idx: - `posix.html#426 `_ - - `ABMON_6`:idx: - `posix.html#427 `_ - - `ABMON_7`:idx: - `posix.html#428 `_ - - `ABMON_8`:idx: - `posix.html#429 `_ - - `ABMON_9`:idx: - `posix.html#430 `_ - - `abs`:idx: - * `system.html#258 `_ - * `system.html#259 `_ - * `system.html#260 `_ - * `system.html#261 `_ - * `system.html#262 `_ - * `system.html#317 `_ - * `complex.html#108 `_ - - `access`:idx: - `posix.html#966 `_ - - `acyclic`:idx: - `nimrodc.html#114 `_ - - `add`:idx: - * `system.html#366 `_ - * `system.html#367 `_ - * `system.html#368 `_ - * `system.html#369 `_ - * `system.html#370 `_ - - `addFile`:idx: - * `zipfiles.html#105 `_ - * `zipfiles.html#106 `_ - * `zipfiles.html#107 `_ - - `addQuitProc`:idx: - `system.html#402 `_ - - `adler32`:idx: - `zlib.html#174 `_ - - `AIO_ALLDONE`:idx: - `posix.html#207 `_ - - `aio_cancel`:idx: - `posix.html#784 `_ - - `AIO_CANCELED`:idx: - `posix.html#208 `_ - - `aio_error`:idx: - `posix.html#785 `_ - - `aio_fsync`:idx: - `posix.html#786 `_ - - `AIO_NOTCANCELED`:idx: - `posix.html#209 `_ - - `aio_read`:idx: - `posix.html#787 `_ - - `aio_return`:idx: - `posix.html#788 `_ - - `aio_suspend`:idx: - `posix.html#789 `_ - - `aio_write`:idx: - `posix.html#790 `_ - - `alarm`:idx: - `posix.html#967 `_ - - `alert`:idx: - `manual.html#131 `_ - - `allCharsInSet`:idx: - `strutils.html#137 `_ - - `alloc`:idx: - `system.html#411 `_ - - `alloc0`:idx: - `system.html#412 `_ - - `ALT_DIGITS`:idx: - `posix.html#438 `_ - - `AltSep`:idx: - `os.html#104 `_ - - `AM_STR`:idx: - `posix.html#394 `_ - - `and`:idx: - * `system.html#228 `_ - * `system.html#229 `_ - * `system.html#230 `_ - * `system.html#231 `_ - * `system.html#232 `_ - * `system.html#320 `_ - - `apostrophe`:idx: - `manual.html#129 `_ - - `AppendFileExt`:idx: - `os.html#131 `_ - - `arccos`:idx: - `math.html#117 `_ - - `arcsin`:idx: - `math.html#118 `_ - - `arctan`:idx: - `math.html#119 `_ - - `arctan2`:idx: - `math.html#120 `_ - - `array`:idx: - `system.html#121 `_ - - `Arrays`:idx: - `manual.html#153 `_ - - `asctime`:idx: - `posix.html#1092 `_ - - `asctime_r`:idx: - `posix.html#1093 `_ - - `assembler`:idx: - `manual.html#197 `_ - - `assert`:idx: - `system.html#416 `_ - - `Automatic type conversion`:idx: - `manual.html#145 `_ - - `backslash`:idx: - * `manual.html#127 `_ - * `regexprs.html#101 `_ - - `backspace`:idx: - `manual.html#132 `_ - - `basename`:idx: - `posix.html#844 `_ - - `BiggestFloat`:idx: - `system.html#374 `_ - - `BiggestInt`:idx: - `system.html#373 `_ - - `block`:idx: - `manual.html#193 `_ - - `bool`:idx: - `system.html#109 `_ - - `boolean`:idx: - `manual.html#147 `_ - - `break`:idx: - `manual.html#194 `_ - - `breakpoint`:idx: - `endb.html#103 `_ - - `bsd_signal`:idx: - `posix.html#1122 `_ - - `Byte`:idx: - `system.html#125 `_ - - `C`:idx: - `manual.html#136 `_ - - `calling conventions`:idx: - `manual.html#164 `_ - - `capitalize`:idx: - `strutils.html#110 `_ - - `card`:idx: - `system.html#166 `_ - - `carriage return`:idx: - `manual.html#122 `_ - - `case`:idx: - `manual.html#182 `_ - - `catclose`:idx: - `posix.html#1149 `_ - - `catgets`:idx: - `posix.html#1150 `_ - - `catopen`:idx: - `posix.html#1151 `_ - - `cchar`:idx: - `system.html#375 `_ - - `cdecl`:idx: - `manual.html#166 `_ - - `cdouble`:idx: - `system.html#382 `_ - - `cfloat`:idx: - `system.html#381 `_ - - `ChangeFileExt`:idx: - `os.html#132 `_ - - `char`:idx: - `system.html#110 `_ - - `character type`:idx: - `manual.html#148 `_ - - `character with decimal value d`:idx: - `manual.html#130 `_ - - `character with hex value HH`:idx: - `manual.html#135 `_ - - `chdir`:idx: - `posix.html#968 `_ - - `checked runtime error`:idx: - `manual.html#110 `_ - - `chmod`:idx: - `posix.html#1058 `_ - - `ChooseDir`:idx: - `dialogs.html#108 `_ - - `ChooseFilesToOpen`:idx: - `dialogs.html#106 `_ - - `ChooseFileToOpen`:idx: - `dialogs.html#105 `_ - - `ChooseFileToSave`:idx: - `dialogs.html#107 `_ - - `chown`:idx: - `posix.html#969 `_ - - `chr`:idx: - `system.html#168 `_ - - `cint`:idx: - `system.html#378 `_ - - `C_IRGRP`:idx: - `posix.html#104 `_ - - `C_IROTH`:idx: - `posix.html#107 `_ - - `C_IRUSR`:idx: - `posix.html#101 `_ - - `C_ISBLK`:idx: - `posix.html#116 `_ - - `C_ISCHR`:idx: - `posix.html#117 `_ - - `C_ISCTG`:idx: - `posix.html#118 `_ - - `C_ISDIR`:idx: - `posix.html#113 `_ - - `C_ISFIFO`:idx: - `posix.html#114 `_ - - `C_ISGID`:idx: - `posix.html#111 `_ - - `C_ISLNK`:idx: - `posix.html#119 `_ - - `C_ISREG`:idx: - `posix.html#115 `_ - - `C_ISSOCK`:idx: - `posix.html#120 `_ - - `C_ISUID`:idx: - `posix.html#110 `_ - - `C_ISVTX`:idx: - `posix.html#112 `_ - - `C_IWGRP`:idx: - `posix.html#105 `_ - - `C_IWOTH`:idx: - `posix.html#108 `_ - - `C_IWUSR`:idx: - `posix.html#102 `_ - - `C_IXGRP`:idx: - `posix.html#106 `_ - - `C_IXOTH`:idx: - `posix.html#109 `_ - - `C_IXUSR`:idx: - `posix.html#103 `_ - - `classify`:idx: - `math.html#104 `_ - - `clock`:idx: - `posix.html#1094 `_ - - `clock_getcpuclockid`:idx: - `posix.html#1095 `_ - - `clock_getres`:idx: - `posix.html#1096 `_ - - `clock_gettime`:idx: - `posix.html#1097 `_ - - `CLOCK_MONOTONIC`:idx: - `posix.html#700 `_ - - `clock_nanosleep`:idx: - `posix.html#1098 `_ - - `CLOCK_PROCESS_CPUTIME_ID`:idx: - `posix.html#696 `_ - - `CLOCK_REALTIME`:idx: - `posix.html#698 `_ - - `clock_settime`:idx: - `posix.html#1099 `_ - - `CLOCKS_PER_SEC`:idx: - `posix.html#695 `_ - - `CLOCK_THREAD_CPUTIME_ID`:idx: - `posix.html#697 `_ - - `clong`:idx: - `system.html#379 `_ - - `clongdouble`:idx: - `system.html#383 `_ - - `clonglong`:idx: - `system.html#380 `_ - - `close`:idx: - * `lexbase.html#105 `_ - * `parsecfg.html#105 `_ - * `posix.html#970 `_ - * `zipfiles.html#103 `_ - - `closedir`:idx: - `posix.html#800 `_ - - `CloseFile`:idx: - `system.html#484 `_ - - `closure`:idx: - `manual.html#171 `_ - - `cmp`:idx: - * `system.html#359 `_ - * `system.html#360 `_ - - `cmpIgnoreCase`:idx: - `strutils.html#122 `_ - - `cmpIgnoreStyle`:idx: - `strutils.html#123 `_ - - `cmpPaths`:idx: - `os.html#130 `_ - - `CODESET`:idx: - `posix.html#389 `_ - - `comment pieces`:idx: - `manual.html#115 `_ - - `Comments`:idx: - `manual.html#114 `_ - - `CompileDate`:idx: - `system.html#391 `_ - - `CompileTime`:idx: - `system.html#392 `_ - - `complex statements`:idx: - `manual.html#176 `_ - - `compress`:idx: - `zlib.html#154 `_ - - `compress2`:idx: - `zlib.html#155 `_ - - `confstr`:idx: - `posix.html#971 `_ - - `const`:idx: - `manual.html#180 `_ - - `constant expressions`:idx: - `manual.html#108 `_ - - `Constants`:idx: - `manual.html#140 `_ - - `constZIP_SOURCE_FREE`:idx: - `libzip.html#169 `_ - - `continue`:idx: - `manual.html#196 `_ - - `copy`:idx: - * `system.html#403 `_ - * `system.html#404 `_ - - `copyFile`:idx: - `os.html#134 `_ - - `copyMem`:idx: - `system.html#408 `_ - - `cos`:idx: - `math.html#121 `_ - - `cosh`:idx: - `math.html#122 `_ - - `countBits`:idx: - `math.html#107 `_ - - `countdown`:idx: - `system.html#436 `_ - - `countup`:idx: - `system.html#437 `_ - - `cpuEndian`:idx: - `system.html#397 `_ - - `crc32`:idx: - `zlib.html#175 `_ - - `creat`:idx: - `posix.html#811 `_ - - `createDir`:idx: - * `os.html#138 `_ - * `zipfiles.html#104 `_ - - `CRNCYSTR`:idx: - `posix.html#443 `_ - - `crypt`:idx: - `posix.html#972 `_ - - `cschar`:idx: - `system.html#376 `_ - - `cshort`:idx: - `system.html#377 `_ - - `cSIG_HOLD`:idx: - `posix.html#721 `_ - - `CS_PATH`:idx: - `posix.html#482 `_ - - `CS_POSIX_V6_ILP32_OFF32_CFLAGS`:idx: - `posix.html#483 `_ - - `CS_POSIX_V6_ILP32_OFF32_LDFLAGS`:idx: - `posix.html#484 `_ - - `CS_POSIX_V6_ILP32_OFF32_LIBS`:idx: - `posix.html#485 `_ - - `CS_POSIX_V6_ILP32_OFFBIG_CFLAGS`:idx: - `posix.html#486 `_ - - `CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS`:idx: - `posix.html#487 `_ - - `CS_POSIX_V6_ILP32_OFFBIG_LIBS`:idx: - `posix.html#488 `_ - - `CS_POSIX_V6_LP64_OFF64_CFLAGS`:idx: - `posix.html#489 `_ - - `CS_POSIX_V6_LP64_OFF64_LDFLAGS`:idx: - `posix.html#490 `_ - - `CS_POSIX_V6_LP64_OFF64_LIBS`:idx: - `posix.html#491 `_ - - `CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS`:idx: - `posix.html#492 `_ - - `CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS`:idx: - `posix.html#493 `_ - - `CS_POSIX_V6_LPBIG_OFFBIG_LIBS`:idx: - `posix.html#494 `_ - - `CS_POSIX_V6_WIDTH_RESTRICTED_ENVS`:idx: - `posix.html#495 `_ - - `cstring`:idx: - `system.html#112 `_ - - `cstringArray`:idx: - `system.html#384 `_ - - `ctermid`:idx: - `posix.html#973 `_ - - `ctime`:idx: - `posix.html#1100 `_ - - `ctime_r`:idx: - `posix.html#1101 `_ - - `CurDir`:idx: - `os.html#101 `_ - - `dangling else problem`:idx: - `manual.html#177 `_ - - `DAY_1`:idx: - `posix.html#396 `_ - - `DAY_2`:idx: - `posix.html#397 `_ - - `DAY_3`:idx: - `posix.html#398 `_ - - `DAY_4`:idx: - `posix.html#399 `_ - - `DAY_5`:idx: - `posix.html#400 `_ - - `DAY_6`:idx: - `posix.html#401 `_ - - `DAY_7`:idx: - `posix.html#402 `_ - - `daylight`:idx: - `posix.html#701 `_ - - `dbgLineHook`:idx: - `system.html#432 `_ - - `dealloc`:idx: - `system.html#414 `_ - - `debugger`:idx: - `nimrodc.html#111 `_ - - `dec`:idx: - `system.html#157 `_ - - `define`:idx: - `manual.html#223 `_ - - `defined`:idx: - `system.html#114 `_ - - `deflate`:idx: - `zlib.html#143 `_ - - `deflateCopy`:idx: - `zlib.html#148 `_ - - `deflateEnd`:idx: - `zlib.html#144 `_ - - `deflateInit`:idx: - `zlib.html#178 `_ - - `deflateInit2`:idx: - `zlib.html#182 `_ - - `deflateInit2u`:idx: - `zlib.html#180 `_ - - `deflateInitu`:idx: - `zlib.html#176 `_ - - `deflateParams`:idx: - `zlib.html#150 `_ - - `deflateReset`:idx: - `zlib.html#149 `_ - - `deflateSetDictionary`:idx: - `zlib.html#147 `_ - - `deleteStr`:idx: - `strutils.html#116 `_ - - `D_FMT`:idx: - `posix.html#391 `_ - - `difftime`:idx: - `posix.html#1102 `_ - - `dirname`:idx: - `posix.html#845 `_ - - `DirSep`:idx: - `os.html#103 `_ - - `discard`:idx: - `manual.html#178 `_ - - `div`:idx: - * `system.html#208 `_ - * `system.html#209 `_ - * `system.html#210 `_ - * `system.html#211 `_ - * `system.html#212 `_ - - `dlclose`:idx: - `posix.html#807 `_ - - `dlerror`:idx: - `posix.html#808 `_ - - `dlopen`:idx: - `posix.html#809 `_ - - `dlsym`:idx: - `posix.html#810 `_ - - `dom`:idx: - `nimrodc.html#120 `_ - - `domain specific languages`:idx: - `manual.html#212 `_ - - `D_T_FMT`:idx: - `posix.html#390 `_ - - `dup`:idx: - `posix.html#974 `_ - - `dup2`:idx: - `posix.html#975 `_ - - `dynamic type`:idx: - `manual.html#104 `_ - - `dynlib`:idx: - `nimrodc.html#103 `_ - - `E`:idx: - `math.html#102 `_ - - `E2BIG`:idx: - `posix.html#220 `_ - - `EACCES`:idx: - `posix.html#221 `_ - - `EAccessViolation`:idx: - `system.html#140 `_ - - `EADDRINUSE`:idx: - `posix.html#222 `_ - - `EADDRNOTAVAIL`:idx: - `posix.html#223 `_ - - `EAFNOSUPPORT`:idx: - `posix.html#224 `_ - - `EAGAIN`:idx: - `posix.html#225 `_ - - `EALREADY`:idx: - `posix.html#226 `_ - - `EArithmetic`:idx: - `system.html#137 `_ - - `EAssertionFailed`:idx: - `system.html#141 `_ - - `EAsynch`:idx: - `system.html#131 `_ - - `EBADF`:idx: - `posix.html#227 `_ - - `EBADMSG`:idx: - `posix.html#228 `_ - - `E_Base`:idx: - `system.html#130 `_ - - `EBUSY`:idx: - `posix.html#229 `_ - - `ECANCELED`:idx: - `posix.html#230 `_ - - `ECHILD`:idx: - `posix.html#231 `_ - - `echo`:idx: - `system.html#471 `_ - - `ECMAScript`:idx: - `nimrodc.html#115 `_ - - `ECONNABORTED`:idx: - `posix.html#232 `_ - - `ECONNREFUSED`:idx: - `posix.html#233 `_ - - `ECONNRESET`:idx: - `posix.html#234 `_ - - `EControlC`:idx: - `system.html#142 `_ - - `EDEADLK`:idx: - `posix.html#235 `_ - - `EDESTADDRREQ`:idx: - `posix.html#236 `_ - - `editDistance`:idx: - `strutils.html#142 `_ - - `EDivByZero`:idx: - `system.html#138 `_ - - `EDOM`:idx: - `posix.html#237 `_ - - `EDQUOT`:idx: - `posix.html#238 `_ - - `EEXIST`:idx: - `posix.html#239 `_ - - `EFAULT`:idx: - `posix.html#240 `_ - - `EFBIG`:idx: - `posix.html#241 `_ - - `EHOSTUNREACH`:idx: - `posix.html#242 `_ - - `EIDRM`:idx: - `posix.html#243 `_ - - `EILSEQ`:idx: - `posix.html#244 `_ - - `EINPROGRESS`:idx: - `posix.html#245 `_ - - `EINTR`:idx: - `posix.html#246 `_ - - `EINVAL`:idx: - `posix.html#247 `_ - - `EInvalidField`:idx: - `system.html#146 `_ - - `EInvalidIndex`:idx: - `system.html#145 `_ - - `EInvalidObjectAssignment`:idx: - `system.html#150 `_ - - `EInvalidObjectConversion`:idx: - `system.html#151 `_ - - `EInvalidRegEx`:idx: - `regexprs.html#104 `_ - - `EInvalidValue`:idx: - `system.html#143 `_ - - `EIO`:idx: - * `system.html#134 `_ - * `posix.html#248 `_ - - `EISCONN`:idx: - `posix.html#249 `_ - - `EISDIR`:idx: - `posix.html#250 `_ - - `ELOOP`:idx: - `posix.html#251 `_ - - `Embedded Nimrod Debugger`:idx: - `endb.html#101 `_ - - `EMFILE`:idx: - `posix.html#252 `_ - - `EMLINK`:idx: - `posix.html#253 `_ - - `EMSGSIZE`:idx: - `posix.html#254 `_ - - `EMULTIHOP`:idx: - `posix.html#255 `_ - - `ENAMETOOLONG`:idx: - `posix.html#256 `_ - - `encrypt`:idx: - `posix.html#976 `_ - - `ENDB`:idx: - `endb.html#102 `_ - - `endgrent`:idx: - `posix.html#838 `_ - - `EndOfFile`:idx: - * `system.html#485 `_ - * `lexbase.html#101 `_ - - `endpwent`:idx: - `posix.html#863 `_ - - `endsWith`:idx: - `strutils.html#136 `_ - - `ENETDOWN`:idx: - `posix.html#257 `_ - - `ENETRESET`:idx: - `posix.html#258 `_ - - `ENETUNREACH`:idx: - `posix.html#259 `_ - - `ENFILE`:idx: - `posix.html#260 `_ - - `ENOBUFS`:idx: - `posix.html#261 `_ - - `ENODATA`:idx: - `posix.html#262 `_ - - `ENODEV`:idx: - `posix.html#263 `_ - - `ENOENT`:idx: - `posix.html#264 `_ - - `ENoExceptionToReraise`:idx: - * `manual.html#185 `_ - * `system.html#149 `_ - - `ENOEXEC`:idx: - `posix.html#265 `_ - - `ENOLCK`:idx: - `posix.html#266 `_ - - `ENOLINK`:idx: - `posix.html#267 `_ - - `ENOMEM`:idx: - `posix.html#268 `_ - - `ENOMSG`:idx: - `posix.html#269 `_ - - `ENOPROTOOPT`:idx: - `posix.html#270 `_ - - `ENOSPC`:idx: - `posix.html#271 `_ - - `ENOSR`:idx: - `posix.html#272 `_ - - `ENOSTR`:idx: - `posix.html#273 `_ - - `ENOSYS`:idx: - `posix.html#274 `_ - - `ENOTCONN`:idx: - `posix.html#275 `_ - - `ENOTDIR`:idx: - `posix.html#276 `_ - - `ENOTEMPTY`:idx: - `posix.html#277 `_ - - `ENOTSOCK`:idx: - `posix.html#278 `_ - - `ENOTSUP`:idx: - `posix.html#279 `_ - - `ENOTTY`:idx: - `posix.html#280 `_ - - `Enumeration`:idx: - `manual.html#149 `_ - - `ENXIO`:idx: - `posix.html#281 `_ - - `EOPNOTSUPP`:idx: - `posix.html#282 `_ - - `EOS`:idx: - `system.html#135 `_ - - `EOutOfMemory`:idx: - `system.html#144 `_ - - `EOutOfRange`:idx: - * `manual.html#146 `_ - * `system.html#147 `_ - - `EOVERFLOW`:idx: - `posix.html#283 `_ - - `EOverflow`:idx: - `system.html#139 `_ - - `EPERM`:idx: - `posix.html#284 `_ - - `EPIPE`:idx: - `posix.html#285 `_ - - `EPROTO`:idx: - `posix.html#286 `_ - - `EPROTONOSUPPORT`:idx: - `posix.html#287 `_ - - `EPROTOTYPE`:idx: - `posix.html#288 `_ - - `equalMem`:idx: - `system.html#410 `_ - - `ERA`:idx: - `posix.html#434 `_ - - `ERA_D_FMT`:idx: - `posix.html#435 `_ - - `ERA_D_T_FMT`:idx: - `posix.html#436 `_ - - `ERANGE`:idx: - `posix.html#289 `_ - - `ERA_T_FMT`:idx: - `posix.html#437 `_ - - `ERessourceExhausted`:idx: - `system.html#136 `_ - - `EROFS`:idx: - `posix.html#290 `_ - - `errno`:idx: - `posix.html#219 `_ - - `error`:idx: - * `manual.html#222 `_ - * `manual.html#225 `_ - * `dialogs.html#104 `_ - - `errorStr`:idx: - `parsecfg.html#110 `_ - - `escape`:idx: - * `manual.html#133 `_ - * `strutils.html#141 `_ - - `escape sequences`:idx: - `manual.html#120 `_ - - `ESPIPE`:idx: - `posix.html#291 `_ - - `ESRCH`:idx: - `posix.html#292 `_ - - `EStackOverflow`:idx: - `system.html#148 `_ - - `ESTALE`:idx: - `posix.html#293 `_ - - `ESynch`:idx: - `system.html#132 `_ - - `ESystem`:idx: - `system.html#133 `_ - - `ETIME`:idx: - `posix.html#294 `_ - - `ETIMEDOUT`:idx: - `posix.html#295 `_ - - `ETXTBSY`:idx: - `posix.html#296 `_ - - `EWOULDBLOCK`:idx: - `posix.html#297 `_ - - `except`:idx: - `manual.html#188 `_ - - `exception handlers`:idx: - `manual.html#187 `_ - - `excl`:idx: - `system.html#165 `_ - - `EXDEV`:idx: - `posix.html#298 `_ - - `execl`:idx: - `posix.html#977 `_ - - `execle`:idx: - `posix.html#978 `_ - - `execlp`:idx: - `posix.html#979 `_ - - `executeShellCommand`:idx: - `os.html#133 `_ - - `execv`:idx: - `posix.html#980 `_ - - `execve`:idx: - `posix.html#981 `_ - - `execvp`:idx: - `posix.html#982 `_ - - `ExeExt`:idx: - `os.html#107 `_ - - `existsDir`:idx: - `os.html#139 `_ - - `existsEnv`:idx: - `os.html#144 `_ - - `ExistsFile`:idx: - `os.html#117 `_ - - `exp`:idx: - `math.html#114 `_ - - `expandFilename`:idx: - `os.html#116 `_ - - `exportc`:idx: - `nimrodc.html#102 `_ - - `extractDir`:idx: - `os.html#126 `_ - - `extractFileExt`:idx: - `os.html#128 `_ - - `extractFilename`:idx: - `os.html#127 `_ - - `extractFileTrunk`:idx: - `os.html#129 `_ - - `ExtSep`:idx: - `os.html#109 `_ - - `fastcall`:idx: - `manual.html#169 `_ - - `fatal`:idx: - `manual.html#226 `_ - - `fchdir`:idx: - `posix.html#984 `_ - - `fchmod`:idx: - `posix.html#1059 `_ - - `fchown`:idx: - `posix.html#983 `_ - - `fcntl`:idx: - `posix.html#812 `_ - - `fdatasync`:idx: - `posix.html#985 `_ - - `FD_CLOEXEC`:idx: - `posix.html#309 `_ - - `FD_CLR`:idx: - `posix.html#1161 `_ - - `FD_ISSET`:idx: - `posix.html#1162 `_ - - `FD_SET`:idx: - `posix.html#1163 `_ - - `FD_SETSIZE`:idx: - `posix.html#774 `_ - - `F_DUPFD`:idx: - `posix.html#299 `_ - - `FD_ZERO`:idx: - `posix.html#1164 `_ - - `FE_ALL_EXCEPT`:idx: - `posix.html#337 `_ - - `feclearexcept`:idx: - `posix.html#816 `_ - - `FE_DFL_ENV`:idx: - `posix.html#342 `_ - - `FE_DIVBYZERO`:idx: - `posix.html#332 `_ - - `FE_DOWNWARD`:idx: - `posix.html#338 `_ - - `fegetenv`:idx: - `posix.html#823 `_ - - `fegetexceptflag`:idx: - `posix.html#817 `_ - - `fegetround`:idx: - `posix.html#821 `_ - - `feholdexcept`:idx: - `posix.html#824 `_ - - `FE_INEXACT`:idx: - `posix.html#333 `_ - - `FE_INVALID`:idx: - `posix.html#334 `_ - - `FE_OVERFLOW`:idx: - `posix.html#335 `_ - - `feraiseexcept`:idx: - `posix.html#818 `_ - - `fesetenv`:idx: - `posix.html#825 `_ - - `fesetexceptflag`:idx: - `posix.html#819 `_ - - `fesetround`:idx: - `posix.html#822 `_ - - `fetestexcept`:idx: - `posix.html#820 `_ - - `FE_TONEAREST`:idx: - `posix.html#339 `_ - - `FE_TOWARDZERO`:idx: - `posix.html#340 `_ - - `FE_UNDERFLOW`:idx: - `posix.html#336 `_ - - `feupdateenv`:idx: - `posix.html#826 `_ - - `FE_UPWARD`:idx: - `posix.html#341 `_ - - `F_GETFD`:idx: - `posix.html#300 `_ - - `F_GETFL`:idx: - `posix.html#302 `_ - - `F_GETLK`:idx: - `posix.html#304 `_ - - `F_GETOWN`:idx: - `posix.html#307 `_ - - `fileHandle`:idx: - `system.html#509 `_ - - `fileNewer`:idx: - `os.html#141 `_ - - `FileSystemCaseSensitive`:idx: - `os.html#106 `_ - - `finally`:idx: - `manual.html#189 `_ - - `find`:idx: - * `system.html#456 `_ - * `regexprs.html#109 `_ - * `regexprs.html#110 `_ - - `findSubStr`:idx: - * `strutils.html#112 `_ - * `strutils.html#113 `_ - - `float`:idx: - `system.html#106 `_ - - `float32`:idx: - `system.html#107 `_ - - `float64`:idx: - `system.html#108 `_ - - `F_LOCK`:idx: - `posix.html#496 `_ - - `FlushFile`:idx: - `system.html#487 `_ - - `fmtmsg`:idx: - `posix.html#827 `_ - - `fnmatch`:idx: - `posix.html#828 `_ - - `FNM_NOESCAPE`:idx: - `posix.html#365 `_ - - `FNM_NOMATCH`:idx: - `posix.html#362 `_ - - `FNM_NOSYS`:idx: - `posix.html#366 `_ - - `FNM_PATHNAME`:idx: - `posix.html#363 `_ - - `FNM_PERIOD`:idx: - `posix.html#364 `_ - - `F_OK`:idx: - `posix.html#478 `_ - - `for`:idx: - `manual.html#204 `_ - - `fork`:idx: - `posix.html#986 `_ - - `form feed`:idx: - `manual.html#124 `_ - - `forward`:idx: - `manual.html#201 `_ - - `fpathconf`:idx: - `posix.html#987 `_ - - `F_RDLCK`:idx: - `posix.html#310 `_ - - `FreeEnvironmentStringsA`:idx: - `os.html#151 `_ - - `frexp`:idx: - `math.html#115 `_ - - `F_SETFD`:idx: - `posix.html#301 `_ - - `F_SETFL`:idx: - `posix.html#303 `_ - - `F_SETLK`:idx: - `posix.html#305 `_ - - `F_SETLKW`:idx: - `posix.html#306 `_ - - `F_SETOWN`:idx: - `posix.html#308 `_ - - `fstat`:idx: - `posix.html#1060 `_ - - `fstatvfs`:idx: - `posix.html#1057 `_ - - `fsync`:idx: - `posix.html#988 `_ - - `F_TEST`:idx: - `posix.html#497 `_ - - `F_TLOCK`:idx: - `posix.html#498 `_ - - `ftok`:idx: - `posix.html#1055 `_ - - `ftruncate`:idx: - `posix.html#989 `_ - - `ftw`:idx: - `posix.html#829 `_ - - `FTW_CHDIR`:idx: - `posix.html#377 `_ - - `FTW_D`:idx: - `posix.html#368 `_ - - `FTW_DEPTH`:idx: - `posix.html#376 `_ - - `FTW_DNR`:idx: - `posix.html#369 `_ - - `FTW_DP`:idx: - `posix.html#370 `_ - - `FTW_F`:idx: - `posix.html#367 `_ - - `FTW_MOUNT`:idx: - `posix.html#375 `_ - - `FTW_NS`:idx: - `posix.html#371 `_ - - `FTW_PHYS`:idx: - `posix.html#374 `_ - - `FTW_SL`:idx: - `posix.html#372 `_ - - `FTW_SLN`:idx: - `posix.html#373 `_ - - `F_ULOCK`:idx: - `posix.html#499 `_ - - `functional`:idx: - `manual.html#163 `_ - - `F_UNLCK`:idx: - `posix.html#311 `_ - - `funtions`:idx: - `manual.html#199 `_ - - `F_WRLCK`:idx: - `posix.html#312 `_ - - `GC_disable`:idx: - `system.html#457 `_ - - `GC_disableMarkAndSweep`:idx: - `system.html#463 `_ - - `GC_enable`:idx: - `system.html#458 `_ - - `GC_enableMarkAndSweep`:idx: - `system.html#462 `_ - - `GC_fullCollect`:idx: - `system.html#459 `_ - - `GC_getStatistics`:idx: - `system.html#464 `_ - - `GC_ref`:idx: - * `system.html#465 `_ - * `system.html#466 `_ - * `system.html#467 `_ - - `GC_setStrategy`:idx: - `system.html#461 `_ - - `GC_unref`:idx: - * `system.html#468 `_ - * `system.html#469 `_ - * `system.html#470 `_ - - `generic character types`:idx: - `regexprs.html#102 `_ - - `Generics`:idx: - `manual.html#208 `_ - - `getApplicationDir`:idx: - `os.html#110 `_ - - `getApplicationFilename`:idx: - `os.html#111 `_ - - `getClockStr`:idx: - `times.html#112 `_ - - `getColNumber`:idx: - `lexbase.html#107 `_ - - `getColumn`:idx: - `parsecfg.html#107 `_ - - `getConfigDir`:idx: - `os.html#115 `_ - - `getcontext`:idx: - `posix.html#1188 `_ - - `get_crc_table`:idx: - `zlib.html#186 `_ - - `getCurrentDir`:idx: - `os.html#112 `_ - - `getCurrentExceptionMsg`:idx: - `system.html#428 `_ - - `getCurrentLine`:idx: - `lexbase.html#106 `_ - - `getcwd`:idx: - `posix.html#990 `_ - - `getdate`:idx: - `posix.html#1103 `_ - - `getDateStr`:idx: - `times.html#111 `_ - - `getegid`:idx: - `posix.html#991 `_ - - `getEnv`:idx: - `os.html#143 `_ - - `GetEnvironmentStringsA`:idx: - `os.html#150 `_ - - `geteuid`:idx: - `posix.html#992 `_ - - `getFilename`:idx: - `parsecfg.html#109 `_ - - `getFilePos`:idx: - `system.html#507 `_ - - `getFileSize`:idx: - `system.html#499 `_ - - `getFreeMem`:idx: - `system.html#434 `_ - - `getgid`:idx: - `posix.html#993 `_ - - `getGMTime`:idx: - `times.html#107 `_ - - `getgrent`:idx: - `posix.html#837 `_ - - `getgrgid`:idx: - `posix.html#833 `_ - - `getgrgid_r`:idx: - `posix.html#835 `_ - - `getgrnam`:idx: - `posix.html#834 `_ - - `getgrnam_r`:idx: - `posix.html#836 `_ - - `getgroups`:idx: - `posix.html#994 `_ - - `getHomeDir`:idx: - `os.html#114 `_ - - `gethostid`:idx: - `posix.html#995 `_ - - `gethostname`:idx: - `posix.html#996 `_ - - `getLastModificationTime`:idx: - `os.html#140 `_ - - `getLine`:idx: - `parsecfg.html#108 `_ - - `getLocalTime`:idx: - `times.html#106 `_ - - `getlogin`:idx: - `posix.html#997 `_ - - `getlogin_r`:idx: - `posix.html#998 `_ - - `getOccupiedMem`:idx: - `system.html#433 `_ - - `getopt`:idx: - * `parseopt.html#106 `_ - * `posix.html#999 `_ - - `getpgid`:idx: - `posix.html#1000 `_ - - `getpgrp`:idx: - `posix.html#1001 `_ - - `getpid`:idx: - `posix.html#1002 `_ - - `getppid`:idx: - `posix.html#1003 `_ - - `getpwent`:idx: - `posix.html#864 `_ - - `getpwnam`:idx: - `posix.html#859 `_ - - `getpwnam_r`:idx: - `posix.html#861 `_ - - `getpwuid`:idx: - `posix.html#860 `_ - - `getpwuid_r`:idx: - `posix.html#862 `_ - - `getRefcount`:idx: - `system.html#427 `_ - - `getRestOfCommandLine`:idx: - `parseopt.html#105 `_ - - `getsid`:idx: - `posix.html#1004 `_ - - `getStartMilsecs`:idx: - `times.html#116 `_ - - `getStream`:idx: - `zipfiles.html#109 `_ - - `getTime`:idx: - `times.html#105 `_ - - `getTotalMem`:idx: - `system.html#435 `_ - - `getuid`:idx: - `posix.html#1005 `_ - - `getwd`:idx: - `posix.html#1006 `_ - - `glob`:idx: - `posix.html#831 `_ - - `GLOB_ABORTED`:idx: - `posix.html#385 `_ - - `GLOB_APPEND`:idx: - `posix.html#378 `_ - - `GLOB_DOOFFS`:idx: - `posix.html#379 `_ - - `GLOB_ERR`:idx: - `posix.html#380 `_ - - `globfree`:idx: - `posix.html#832 `_ - - `GLOB_MARK`:idx: - `posix.html#381 `_ - - `GLOB_NOCHECK`:idx: - `posix.html#382 `_ - - `GLOB_NOESCAPE`:idx: - `posix.html#383 `_ - - `GLOB_NOMATCH`:idx: - `posix.html#386 `_ - - `GLOB_NOSORT`:idx: - `posix.html#384 `_ - - `GLOB_NOSPACE`:idx: - `posix.html#387 `_ - - `GLOB_NOSYS`:idx: - `posix.html#388 `_ - - `gmtime`:idx: - `posix.html#1104 `_ - - `gmtime_r`:idx: - `posix.html#1105 `_ - - `gzclose`:idx: - `zlib.html#172 `_ - - `gzdopen`:idx: - `zlib.html#158 `_ - - `gzeof`:idx: - `zlib.html#171 `_ - - `gzerror`:idx: - `zlib.html#173 `_ - - `gzFile`:idx: - `zlib.html#115 `_ - - `gzflush`:idx: - `zlib.html#167 `_ - - `gzgetc`:idx: - `zlib.html#166 `_ - - `gzgets`:idx: - `zlib.html#164 `_ - - `gzopen`:idx: - `zlib.html#157 `_ - - `gzprintf`:idx: - `zlib.html#162 `_ - - `gzputc`:idx: - `zlib.html#165 `_ - - `gzputs`:idx: - `zlib.html#163 `_ - - `gzread`:idx: - `zlib.html#160 `_ - - `gzrewind`:idx: - `zlib.html#169 `_ - - `gzseek`:idx: - `zlib.html#168 `_ - - `gzsetparams`:idx: - `zlib.html#159 `_ - - `gztell`:idx: - `zlib.html#170 `_ - - `gzwrite`:idx: - `zlib.html#161 `_ - - `HandleCR`:idx: - `lexbase.html#108 `_ - - `HandleLF`:idx: - `lexbase.html#109 `_ - - `hash`:idx: - * `hashes.html#103 `_ - * `hashes.html#104 `_ - * `hashes.html#105 `_ - * `hashes.html#106 `_ - * `hashes.html#107 `_ - - `hashData`:idx: - `hashes.html#102 `_ - - `hashIgnoreCase`:idx: - `hashes.html#109 `_ - - `hashIgnoreStyle`:idx: - `hashes.html#108 `_ - - `hasKey`:idx: - `strtabs.html#108 `_ - - `header`:idx: - `nimrodc.html#105 `_ - - `high`:idx: - `system.html#118 `_ - - `hint`:idx: - * `manual.html#220 `_ - * `manual.html#228 `_ - - `htonl`:idx: - `posix.html#792 `_ - - `htons`:idx: - `posix.html#793 `_ - - `hypot`:idx: - `math.html#123 `_ - - `iconv`:idx: - `posix.html#841 `_ - - `iconv_close`:idx: - `posix.html#842 `_ - - `iconv_open`:idx: - `posix.html#840 `_ - - `identifier`:idx: - `manual.html#105 `_ - - `Identifiers`:idx: - `manual.html#116 `_ - - `if`:idx: - `manual.html#181 `_ - - `implicit block`:idx: - `manual.html#206 `_ - - `import`:idx: - `manual.html#216 `_ - - `importc`:idx: - `nimrodc.html#101 `_ - - `in`:idx: - `system.html#355 `_ - - `inc`:idx: - `system.html#156 `_ - - `incl`:idx: - `system.html#164 `_ - - `indentation sensitive`:idx: - `manual.html#113 `_ - - `inet_addr`:idx: - `posix.html#796 `_ - - `inet_ntoa`:idx: - `posix.html#797 `_ - - `inet_ntop`:idx: - `posix.html#798 `_ - - `inet_pton`:idx: - `posix.html#799 `_ - - `inf`:idx: - `system.html#429 `_ - - `inflate`:idx: - `zlib.html#145 `_ - - `inflateEnd`:idx: - `zlib.html#146 `_ - - `inflateInit`:idx: - `zlib.html#179 `_ - - `inflateInit2`:idx: - `zlib.html#183 `_ - - `inflateInit2u`:idx: - `zlib.html#181 `_ - - `inflateInitu`:idx: - `zlib.html#177 `_ - - `inflateReset`:idx: - `zlib.html#153 `_ - - `inflateSetDictionary`:idx: - `zlib.html#151 `_ - - `inflateSync`:idx: - `zlib.html#152 `_ - - `inflateSyncPoint`:idx: - `zlib.html#185 `_ - - `info`:idx: - `dialogs.html#102 `_ - - `information hiding`:idx: - `manual.html#214 `_ - - `init`:idx: - `parseopt.html#103 `_ - - `inline`:idx: - `manual.html#168 `_ - - `in_Operator`:idx: - `system.html#354 `_ - - `in_Operator`:idx: - * `strutils.html#124 `_ - * `strutils.html#125 `_ - - `int`:idx: - `system.html#101 `_ - - `int16`:idx: - `system.html#103 `_ - - `int32`:idx: - `system.html#104 `_ - - `int64`:idx: - `system.html#105 `_ - - `int8`:idx: - `system.html#102 `_ - - `intToStr`:idx: - `strutils.html#127 `_ - - `IPC_CREAT`:idx: - `posix.html#642 `_ - - `IPC_EXCL`:idx: - `posix.html#643 `_ - - `IPC_NOWAIT`:idx: - `posix.html#644 `_ - - `IPC_PRIVATE`:idx: - `posix.html#645 `_ - - `IPC_RMID`:idx: - `posix.html#646 `_ - - `IPC_SET`:idx: - `posix.html#647 `_ - - `IPC_STAT`:idx: - `posix.html#648 `_ - - `is`:idx: - `system.html#357 `_ - - `isatty`:idx: - `posix.html#1007 `_ - - `isMainModule`:idx: - `system.html#390 `_ - - `isNil`:idx: - * `system.html#444 `_ - * `system.html#445 `_ - * `system.html#446 `_ - * `system.html#447 `_ - * `system.html#448 `_ - * `system.html#449 `_ - - `is_not`:idx: - `system.html#358 `_ - - `isPowerOfTwo`:idx: - `math.html#105 `_ - - `items`:idx: - * `system.html#438 `_ - * `system.html#439 `_ - * `system.html#440 `_ - * `system.html#441 `_ - * `system.html#442 `_ - * `system.html#443 `_ - - `iterator`:idx: - `manual.html#205 `_ - - `iterOverEnvironment`:idx: - `os.html#152 `_ - - `JavaScript`:idx: - `nimrodc.html#116 `_ - - `JoinPath`:idx: - * `os.html#118 `_ - * `os.html#120 `_ - - `keywords`:idx: - `manual.html#117 `_ - - `kill`:idx: - `posix.html#1123 `_ - - `killpg`:idx: - `posix.html#1124 `_ - - `l-values`:idx: - `manual.html#107 `_ - - `LC_ALL`:idx: - `posix.html#444 `_ - - `LC_COLLATE`:idx: - `posix.html#445 `_ - - `LC_CTYPE`:idx: - `posix.html#446 `_ - - `lchown`:idx: - `posix.html#1008 `_ - - `LC_MESSAGES`:idx: - `posix.html#447 `_ - - `LC_MONETARY`:idx: - `posix.html#448 `_ - - `LC_NUMERIC`:idx: - `posix.html#449 `_ - - `LC_TIME`:idx: - `posix.html#450 `_ - - `len`:idx: - * `system.html#159 `_ - * `system.html#160 `_ - * `system.html#161 `_ - * `system.html#162 `_ - * `system.html#163 `_ - * `strtabs.html#109 `_ - - `line feed`:idx: - `manual.html#123 `_ - - `line_dir`:idx: - `nimrodc.html#108 `_ - - `lines`:idx: - `system.html#508 `_ - - `line_trace`:idx: - `nimrodc.html#110 `_ - - `link`:idx: - `posix.html#1009 `_ - - `lio_listio`:idx: - `posix.html#791 `_ - - `LIO_NOP`:idx: - `posix.html#210 `_ - - `LIO_NOWAIT`:idx: - `posix.html#211 `_ - - `LIO_READ`:idx: - `posix.html#212 `_ - - `LIO_WAIT`:idx: - `posix.html#213 `_ - - `LIO_WRITE`:idx: - `posix.html#214 `_ - - `Literal strings`:idx: - `manual.html#119 `_ - - `ln`:idx: - `math.html#111 `_ - - `localeconv`:idx: - `posix.html#846 `_ - - `localtime`:idx: - `posix.html#1106 `_ - - `localtime_r`:idx: - `posix.html#1107 `_ - - `locations`:idx: - `manual.html#101 `_ - - `lockf`:idx: - `posix.html#1010 `_ - - `log10`:idx: - `math.html#112 `_ - - `log2`:idx: - `math.html#113 `_ - - `low`:idx: - `system.html#119 `_ - - `lseek`:idx: - `posix.html#1011 `_ - - `lstat`:idx: - `posix.html#1061 `_ - - `Macros`:idx: - `manual.html#211 `_ - - `makecontext`:idx: - `posix.html#1189 `_ - - `MAP_FAILED`:idx: - `posix.html#686 `_ - - `MAP_FIXED`:idx: - `posix.html#680 `_ - - `MAP_PRIVATE`:idx: - `posix.html#679 `_ - - `MAP_SHARED`:idx: - `posix.html#678 `_ - - `match`:idx: - * `regexprs.html#106 `_ - * `regexprs.html#107 `_ - - `matchLen`:idx: - `regexprs.html#108 `_ - - `math`:idx: - `nimrodc.html#118 `_ - - `max`:idx: - * `system.html#268 `_ - * `system.html#269 `_ - * `system.html#270 `_ - * `system.html#271 `_ - * `system.html#272 `_ - * `system.html#319 `_ - - `MaxSubpatterns`:idx: - `regexprs.html#105 `_ - - `MCL_CURRENT`:idx: - `posix.html#684 `_ - - `MCL_FUTURE`:idx: - `posix.html#685 `_ - - `methods`:idx: - `manual.html#198 `_ - - `min`:idx: - * `system.html#263 `_ - * `system.html#264 `_ - * `system.html#265 `_ - * `system.html#266 `_ - * `system.html#267 `_ - * `system.html#318 `_ - - `MINSIGSTKSZ`:idx: - `posix.html#766 `_ - - `mkdir`:idx: - `posix.html#1062 `_ - - `mkfifo`:idx: - `posix.html#1063 `_ - - `mknod`:idx: - `posix.html#1064 `_ - - `mktime`:idx: - `posix.html#1108 `_ - - `mlock`:idx: - `posix.html#1078 `_ - - `mlockall`:idx: - `posix.html#1079 `_ - - `mmap`:idx: - `posix.html#1080 `_ - - `MM_APPL`:idx: - `posix.html#346 `_ - - `MM_CONSOLE`:idx: - `posix.html#357 `_ - - `MM_ERROR`:idx: - `posix.html#352 `_ - - `MM_FIRM`:idx: - `posix.html#345 `_ - - `MM_HALT`:idx: - `posix.html#351 `_ - - `MM_HARD`:idx: - `posix.html#343 `_ - - `MM_INFO`:idx: - `posix.html#354 `_ - - `MM_NOCON`:idx: - `posix.html#361 `_ - - `MM_NOMSG`:idx: - `posix.html#360 `_ - - `MM_NOSEV`:idx: - `posix.html#355 `_ - - `MM_NOTOK`:idx: - `posix.html#359 `_ - - `MM_NRECOV`:idx: - `posix.html#350 `_ - - `MM_NULLACT`:idx: - `posix.html#125 `_ - - `MM_NULLLBL`:idx: - `posix.html#121 `_ - - `MM_NULLMC`:idx: - `posix.html#123 `_ - - `MM_NULLSEV`:idx: - `posix.html#122 `_ - - `MM_NULLTAG`:idx: - `posix.html#126 `_ - - `MM_NULLTXT`:idx: - `posix.html#124 `_ - - `MM_OK`:idx: - `posix.html#358 `_ - - `MM_OPSYS`:idx: - `posix.html#348 `_ - - `MM_PRINT`:idx: - `posix.html#356 `_ - - `MM_RECOVER`:idx: - `posix.html#349 `_ - - `MM_SOFT`:idx: - `posix.html#344 `_ - - `MM_UTIL`:idx: - `posix.html#347 `_ - - `MM_WARNING`:idx: - `posix.html#353 `_ - - `mod`:idx: - * `system.html#213 `_ - * `system.html#214 `_ - * `system.html#215 `_ - * `system.html#216 `_ - * `system.html#217 `_ - - `module`:idx: - `manual.html#213 `_ - - `MON_1`:idx: - `posix.html#410 `_ - - `MON_10`:idx: - `posix.html#419 `_ - - `MON_11`:idx: - `posix.html#420 `_ - - `MON_12`:idx: - `posix.html#421 `_ - - `MON_2`:idx: - `posix.html#411 `_ - - `MON_3`:idx: - `posix.html#412 `_ - - `MON_4`:idx: - `posix.html#413 `_ - - `MON_5`:idx: - `posix.html#414 `_ - - `MON_6`:idx: - `posix.html#415 `_ - - `MON_7`:idx: - `posix.html#416 `_ - - `MON_8`:idx: - `posix.html#417 `_ - - `MON_9`:idx: - `posix.html#418 `_ - - `moveFile`:idx: - `os.html#135 `_ - - `moveMem`:idx: - `system.html#409 `_ - - `mprotect`:idx: - `posix.html#1081 `_ - - `mq_close`:idx: - `posix.html#849 `_ - - `mq_getattr`:idx: - `posix.html#850 `_ - - `mq_notify`:idx: - `posix.html#851 `_ - - `mq_open`:idx: - `posix.html#852 `_ - - `mq_receive`:idx: - `posix.html#853 `_ - - `mq_send`:idx: - `posix.html#854 `_ - - `mq_setattr`:idx: - `posix.html#855 `_ - - `mq_timedreceive`:idx: - `posix.html#856 `_ - - `mq_timedsend`:idx: - `posix.html#857 `_ - - `mq_unlink`:idx: - `posix.html#858 `_ - - `MS_ASYNC`:idx: - `posix.html#681 `_ - - `MS_INVALIDATE`:idx: - `posix.html#683 `_ - - `MS_SYNC`:idx: - `posix.html#682 `_ - - `msync`:idx: - `posix.html#1082 `_ - - `munlock`:idx: - `posix.html#1083 `_ - - `munlockall`:idx: - `posix.html#1084 `_ - - `munmap`:idx: - `posix.html#1085 `_ - - `nan`:idx: - `system.html#431 `_ - - `nanosleep`:idx: - `posix.html#1109 `_ - - `Natural`:idx: - `system.html#126 `_ - - `neginf`:idx: - `system.html#430 `_ - - `new`:idx: - * `system.html#116 `_ - * `system.html#117 `_ - - `newFileStream`:idx: - * `streams.html#120 `_ - * `streams.html#121 `_ - - `newline`:idx: - `manual.html#121 `_ - - `NewLines`:idx: - `lexbase.html#102 `_ - - `newSeq`:idx: - `system.html#158 `_ - - `newString`:idx: - `system.html#406 `_ - - `newStringStream`:idx: - `streams.html#117 `_ - - `newStringTable`:idx: - * `strtabs.html#104 `_ - * `strtabs.html#105 `_ - - `next`:idx: - * `parseopt.html#104 `_ - * `parsecfg.html#106 `_ - - `nextPowerOfTwo`:idx: - `math.html#106 `_ - - `nftw`:idx: - `posix.html#830 `_ - - `nice`:idx: - `posix.html#1012 `_ - - `nimcall`:idx: - `manual.html#170 `_ - - `NimrodMajor`:idx: - `system.html#394 `_ - - `NimrodMinor`:idx: - `system.html#395 `_ - - `NimrodPatch`:idx: - `system.html#396 `_ - - `NimrodVersion`:idx: - `system.html#393 `_ - - `nl`:idx: - `strutils.html#104 `_ - - `NL_CAT_LOCALE`:idx: - `posix.html#769 `_ - - `nl_langinfo`:idx: - `posix.html#843 `_ - - `NL_SETD`:idx: - `posix.html#768 `_ - - `noconv`:idx: - `manual.html#173 `_ - - `no_decl`:idx: - `nimrodc.html#104 `_ - - `NOEXPR`:idx: - `posix.html#442 `_ - - `normalize`:idx: - `strutils.html#111 `_ - - `no_static`:idx: - `nimrodc.html#107 `_ - - `not`:idx: - * `system.html#115 `_ - * `system.html#188 `_ - * `system.html#189 `_ - * `system.html#190 `_ - * `system.html#191 `_ - * `system.html#192 `_ - - `not_in`:idx: - `system.html#356 `_ - - `ntohl`:idx: - `posix.html#794 `_ - - `ntohs`:idx: - `posix.html#795 `_ - - `Numerical constants`:idx: - `manual.html#137 `_ - - `O_ACCMODE`:idx: - `posix.html#322 `_ - - `O_APPEND`:idx: - `posix.html#317 `_ - - `object`:idx: - `manual.html#156 `_ - - `O_CREAT`:idx: - `posix.html#313 `_ - - `ODBC_ADD_DSN`:idx: - `odbcsql.html#621 `_ - - `ODBC_ADD_SYS_DSN`:idx: - `odbcsql.html#624 `_ - - `ODBC_CONFIG_DSN`:idx: - `odbcsql.html#622 `_ - - `ODBC_CONFIG_SYS_DSN`:idx: - `odbcsql.html#625 `_ - - `ODBC_REMOVE_DSN`:idx: - `odbcsql.html#623 `_ - - `ODBC_REMOVE_SYS_DSN`:idx: - `odbcsql.html#626 `_ - - `O_DSYNC`:idx: - `posix.html#318 `_ - - `O_EXCL`:idx: - `posix.html#314 `_ - - `O_NOCTTY`:idx: - `posix.html#315 `_ - - `O_NONBLOCK`:idx: - `posix.html#319 `_ - - `open`:idx: - * `lexbase.html#104 `_ - * `parsecfg.html#104 `_ - * `posix.html#813 `_ - * `zipfiles.html#102 `_ - - `openarray`:idx: - `system.html#122 `_ - - `opendir`:idx: - `posix.html#801 `_ - - `OpenFile`:idx: - * `system.html#482 `_ - * `system.html#483 `_ - - `operator`:idx: - `manual.html#139 `_ - - `Operators`:idx: - `manual.html#203 `_ - - `or`:idx: - * `system.html#233 `_ - * `system.html#234 `_ - * `system.html#235 `_ - * `system.html#236 `_ - * `system.html#237 `_ - * `system.html#321 `_ - - `ord`:idx: - `system.html#167 `_ - - `Ordinal types`:idx: - `manual.html#142 `_ - - `O_RDONLY`:idx: - `posix.html#323 `_ - - `O_RDWR`:idx: - `posix.html#324 `_ - - `O_RSYNC`:idx: - `posix.html#320 `_ - - `OSError`:idx: - `os.html#147 `_ - - `O_SYNC`:idx: - `posix.html#321 `_ - - `O_TRUNC`:idx: - `posix.html#316 `_ - - `O_WRONLY`:idx: - `posix.html#325 `_ - - `pairs`:idx: - `strtabs.html#110 `_ - - `P_ALL`:idx: - `posix.html#716 `_ - - `paramCount`:idx: - `os.html#145 `_ - - `paramStr`:idx: - `os.html#146 `_ - - `ParDir`:idx: - `os.html#102 `_ - - `parentDir`:idx: - `os.html#122 `_ - - `ParseBiggestInt`:idx: - `strutils.html#129 `_ - - `parseCmdLine`:idx: - `os.html#156 `_ - - `ParseFloat`:idx: - `strutils.html#130 `_ - - `ParseInt`:idx: - `strutils.html#128 `_ - - `pathconf`:idx: - `posix.html#1013 `_ - - `PathSep`:idx: - `os.html#105 `_ - - `pause`:idx: - `posix.html#1014 `_ - - `pbyte`:idx: - `zlib.html#106 `_ - - `pbytef`:idx: - `zlib.html#107 `_ - - `PC_2_SYMLINKS`:idx: - `posix.html#500 `_ - - `PC_ALLOC_SIZE_MIN`:idx: - `posix.html#501 `_ - - `PC_ASYNC_IO`:idx: - `posix.html#502 `_ - - `PC_CHOWN_RESTRICTED`:idx: - `posix.html#503 `_ - - `PC_FILESIZEBITS`:idx: - `posix.html#504 `_ - - `PC_LINK_MAX`:idx: - `posix.html#505 `_ - - `PC_MAX_CANON`:idx: - `posix.html#506 `_ - - `PC_MAX_INPUT`:idx: - `posix.html#507 `_ - - `PC_NAME_MAX`:idx: - `posix.html#508 `_ - - `PC_NO_TRUNC`:idx: - `posix.html#509 `_ - - `PC_PATH_MAX`:idx: - `posix.html#510 `_ - - `PC_PIPE_BUF`:idx: - `posix.html#511 `_ - - `PC_PRIO_IO`:idx: - `posix.html#512 `_ - - `PC_REC_INCR_XFER_SIZE`:idx: - `posix.html#513 `_ - - `PC_REC_MIN_XFER_SIZE`:idx: - `posix.html#514 `_ - - `PC_REC_XFER_ALIGN`:idx: - `posix.html#515 `_ - - `PC_SYMLINK_MAX`:idx: - `posix.html#516 `_ - - `PC_SYNC_IO`:idx: - `posix.html#517 `_ - - `PC_VDISABLE`:idx: - `posix.html#518 `_ - - `PFileStream`:idx: - `streams.html#118 `_ - - `PFloat32`:idx: - `system.html#386 `_ - - `PFloat64`:idx: - `system.html#387 `_ - - `PI`:idx: - `math.html#101 `_ - - `PInt32`:idx: - `system.html#389 `_ - - `PInt64`:idx: - `system.html#388 `_ - - `PInternalState`:idx: - `zlib.html#111 `_ - - `pipe`:idx: - `posix.html#1015 `_ - - `PM_STR`:idx: - `posix.html#395 `_ - - `PObject`:idx: - `system.html#129 `_ - - `pointer`:idx: - `system.html#113 `_ - - `pointers`:idx: - `manual.html#159 `_ - - `Positive`:idx: - `system.html#127 `_ - - `POSIX_ASYNC_IO`:idx: - `posix.html#475 `_ - - `POSIX_FADV_DONTNEED`:idx: - `posix.html#330 `_ - - `posix_fadvise`:idx: - `posix.html#814 `_ - - `POSIX_FADV_NOREUSE`:idx: - `posix.html#331 `_ - - `POSIX_FADV_NORMAL`:idx: - `posix.html#326 `_ - - `POSIX_FADV_RANDOM`:idx: - `posix.html#328 `_ - - `POSIX_FADV_SEQUENTIAL`:idx: - `posix.html#327 `_ - - `POSIX_FADV_WILLNEED`:idx: - `posix.html#329 `_ - - `posix_fallocate`:idx: - `posix.html#815 `_ - - `POSIX_MADV_DONTNEED`:idx: - `posix.html#691 `_ - - `posix_madvise`:idx: - `posix.html#1086 `_ - - `POSIX_MADV_NORMAL`:idx: - `posix.html#687 `_ - - `POSIX_MADV_RANDOM`:idx: - `posix.html#689 `_ - - `POSIX_MADV_SEQUENTIAL`:idx: - `posix.html#688 `_ - - `POSIX_MADV_WILLNEED`:idx: - `posix.html#690 `_ - - `posix_mem_offset`:idx: - `posix.html#1087 `_ - - `POSIX_PRIO_IO`:idx: - `posix.html#476 `_ - - `posix_spawn`:idx: - `posix.html#1167 `_ - - `posix_spawnattr_destroy`:idx: - `posix.html#1173 `_ - - `posix_spawnattr_getflags`:idx: - `posix.html#1175 `_ - - `posix_spawnattr_getpgroup`:idx: - `posix.html#1176 `_ - - `posix_spawnattr_getschedparam`:idx: - `posix.html#1177 `_ - - `posix_spawnattr_getschedpolicy`:idx: - `posix.html#1178 `_ - - `posix_spawnattr_getsigdefault`:idx: - `posix.html#1174 `_ - - `posix_spawnattr_getsigmask`:idx: - `posix.html#1179 `_ - - `posix_spawnattr_init`:idx: - `posix.html#1180 `_ - - `posix_spawnattr_setflags`:idx: - `posix.html#1182 `_ - - `posix_spawnattr_setpgroup`:idx: - `posix.html#1183 `_ - - `posix_spawnattr_setschedparam`:idx: - `posix.html#1184 `_ - - `posix_spawnattr_setschedpolicy`:idx: - `posix.html#1185 `_ - - `posix_spawnattr_setsigdefault`:idx: - `posix.html#1181 `_ - - `posix_spawnattr_setsigmask`:idx: - `posix.html#1186 `_ - - `posix_spawn_file_actions_addclose`:idx: - `posix.html#1168 `_ - - `posix_spawn_file_actions_adddup2`:idx: - `posix.html#1169 `_ - - `posix_spawn_file_actions_addopen`:idx: - `posix.html#1170 `_ - - `posix_spawn_file_actions_destroy`:idx: - `posix.html#1171 `_ - - `posix_spawn_file_actions_init`:idx: - `posix.html#1172 `_ - - `posix_spawnp`:idx: - `posix.html#1187 `_ - - `POSIX_SPAWN_RESETIDS`:idx: - `posix.html#778 `_ - - `POSIX_SPAWN_SETPGROUP`:idx: - `posix.html#779 `_ - - `POSIX_SPAWN_SETSCHEDPARAM`:idx: - `posix.html#780 `_ - - `POSIX_SPAWN_SETSCHEDULER`:idx: - `posix.html#781 `_ - - `POSIX_SPAWN_SETSIGDEF`:idx: - `posix.html#782 `_ - - `POSIX_SPAWN_SETSIGMASK`:idx: - `posix.html#783 `_ - - `POSIX_SYNC_IO`:idx: - `posix.html#477 `_ - - `POSIX_TYPED_MEM_ALLOCATE`:idx: - `posix.html#692 `_ - - `POSIX_TYPED_MEM_ALLOCATE_CONTIG`:idx: - `posix.html#693 `_ - - `posix_typed_mem_get_info`:idx: - `posix.html#1088 `_ - - `POSIX_TYPED_MEM_MAP_ALLOCATABLE`:idx: - `posix.html#694 `_ - - `posix_typed_mem_open`:idx: - `posix.html#1089 `_ - - `pow`:idx: - `math.html#127 `_ - - `P_PGID`:idx: - `posix.html#718 `_ - - `P_PID`:idx: - `posix.html#717 `_ - - `pread`:idx: - `posix.html#1016 `_ - - `pred`:idx: - `system.html#155 `_ - - `procedural type`:idx: - `manual.html#162 `_ - - `procedures`:idx: - `manual.html#200 `_ - - `PROT_EXEC`:idx: - `posix.html#676 `_ - - `PROT_NONE`:idx: - `posix.html#677 `_ - - `PROT_READ`:idx: - `posix.html#674 `_ - - `PROT_WRITE`:idx: - `posix.html#675 `_ - - `pselect`:idx: - `posix.html#1165 `_ - - `PSQLCHAR`:idx: - `odbcsql.html#116 `_ - - `PSQL_DATE_STRUCT`:idx: - `odbcsql.html#232 `_ - - `PSQLDOUBLE`:idx: - `odbcsql.html#122 `_ - - `PSQLFLOAT`:idx: - `odbcsql.html#123 `_ - - `PSQLHANDLE`:idx: - `odbcsql.html#124 `_ - - `PSQLINTEGER`:idx: - `odbcsql.html#117 `_ - - `PSQLREAL`:idx: - `odbcsql.html#121 `_ - - `PSQLSMALLINT`:idx: - `odbcsql.html#119 `_ - - `PSQL_TIMESTAMP_STRUCT`:idx: - `odbcsql.html#236 `_ - - `PSQL_TIME_STRUCT`:idx: - `odbcsql.html#234 `_ - - `PSQLUINTEGER`:idx: - `odbcsql.html#118 `_ - - `PSQLUSMALLINT`:idx: - `odbcsql.html#120 `_ - - `PStream`:idx: - `streams.html#101 `_ - - `PStringStream`:idx: - `streams.html#115 `_ - - `PStringTable`:idx: - `strtabs.html#103 `_ - - `pthread_atfork`:idx: - `posix.html#867 `_ - - `pthread_attr_destroy`:idx: - `posix.html#868 `_ - - `pthread_attr_getdetachstate`:idx: - `posix.html#869 `_ - - `pthread_attr_getguardsize`:idx: - `posix.html#870 `_ - - `pthread_attr_getinheritsched`:idx: - `posix.html#871 `_ - - `pthread_attr_getschedparam`:idx: - `posix.html#872 `_ - - `pthread_attr_getschedpolicy`:idx: - `posix.html#873 `_ - - `pthread_attr_getscope`:idx: - `posix.html#874 `_ - - `pthread_attr_getstack`:idx: - `posix.html#875 `_ - - `pthread_attr_getstackaddr`:idx: - `posix.html#876 `_ - - `pthread_attr_getstacksize`:idx: - `posix.html#877 `_ - - `pthread_attr_init`:idx: - `posix.html#878 `_ - - `pthread_attr_setdetachstate`:idx: - `posix.html#879 `_ - - `pthread_attr_setguardsize`:idx: - `posix.html#880 `_ - - `pthread_attr_setinheritsched`:idx: - `posix.html#881 `_ - - `pthread_attr_setschedparam`:idx: - `posix.html#882 `_ - - `pthread_attr_setschedpolicy`:idx: - `posix.html#883 `_ - - `pthread_attr_setscope`:idx: - `posix.html#884 `_ - - `pthread_attr_setstack`:idx: - `posix.html#885 `_ - - `pthread_attr_setstackaddr`:idx: - `posix.html#886 `_ - - `pthread_attr_setstacksize`:idx: - `posix.html#887 `_ - - `pthread_barrierattr_destroy`:idx: - `posix.html#891 `_ - - `pthread_barrierattr_getpshared`:idx: - `posix.html#892 `_ - - `pthread_barrierattr_init`:idx: - `posix.html#893 `_ - - `pthread_barrierattr_setpshared`:idx: - `posix.html#894 `_ - - `pthread_barrier_destroy`:idx: - `posix.html#888 `_ - - `pthread_barrier_init`:idx: - `posix.html#889 `_ - - `PTHREAD_BARRIER_SERIAL_THREAD`:idx: - `posix.html#451 `_ - - `pthread_barrier_wait`:idx: - `posix.html#890 `_ - - `pthread_cancel`:idx: - `posix.html#895 `_ - - `PTHREAD_CANCEL_ASYNCHRONOUS`:idx: - `posix.html#452 `_ - - `PTHREAD_CANCEL_DEFERRED`:idx: - `posix.html#454 `_ - - `PTHREAD_CANCEL_DISABLE`:idx: - `posix.html#455 `_ - - `PTHREAD_CANCELED`:idx: - `posix.html#456 `_ - - `PTHREAD_CANCEL_ENABLE`:idx: - `posix.html#453 `_ - - `pthread_cleanup_pop`:idx: - `posix.html#897 `_ - - `pthread_cleanup_push`:idx: - `posix.html#896 `_ - - `pthread_condattr_destroy`:idx: - `posix.html#904 `_ - - `pthread_condattr_getclock`:idx: - `posix.html#905 `_ - - `pthread_condattr_getpshared`:idx: - `posix.html#906 `_ - - `pthread_condattr_init`:idx: - `posix.html#907 `_ - - `pthread_condattr_setclock`:idx: - `posix.html#908 `_ - - `pthread_condattr_setpshared`:idx: - `posix.html#909 `_ - - `pthread_cond_broadcast`:idx: - `posix.html#898 `_ - - `pthread_cond_destroy`:idx: - `posix.html#899 `_ - - `pthread_cond_init`:idx: - `posix.html#900 `_ - - `PTHREAD_COND_INITIALIZER`:idx: - `posix.html#457 `_ - - `pthread_cond_signal`:idx: - `posix.html#901 `_ - - `pthread_cond_timedwait`:idx: - `posix.html#902 `_ - - `pthread_cond_wait`:idx: - `posix.html#903 `_ - - `pthread_create`:idx: - `posix.html#910 `_ - - `PTHREAD_CREATE_DETACHED`:idx: - `posix.html#458 `_ - - `PTHREAD_CREATE_JOINABLE`:idx: - `posix.html#459 `_ - - `pthread_detach`:idx: - `posix.html#911 `_ - - `pthread_equal`:idx: - `posix.html#912 `_ - - `pthread_exit`:idx: - `posix.html#913 `_ - - `PTHREAD_EXPLICIT_SCHED`:idx: - `posix.html#460 `_ - - `pthread_getconcurrency`:idx: - `posix.html#914 `_ - - `pthread_getcpuclockid`:idx: - `posix.html#915 `_ - - `pthread_getschedparam`:idx: - `posix.html#916 `_ - - `pthread_getspecific`:idx: - `posix.html#917 `_ - - `PTHREAD_INHERIT_SCHED`:idx: - `posix.html#461 `_ - - `pthread_join`:idx: - `posix.html#918 `_ - - `pthread_key_create`:idx: - `posix.html#919 `_ - - `pthread_key_delete`:idx: - `posix.html#920 `_ - - `pthread_kill`:idx: - `posix.html#1125 `_ - - `pthread_mutexattr_destroy`:idx: - `posix.html#929 `_ - - `pthread_mutexattr_getprioceiling`:idx: - `posix.html#930 `_ - - `pthread_mutexattr_getprotocol`:idx: - `posix.html#931 `_ - - `pthread_mutexattr_getpshared`:idx: - `posix.html#932 `_ - - `pthread_mutexattr_gettype`:idx: - `posix.html#933 `_ - - `pthread_mutexattr_init`:idx: - `posix.html#934 `_ - - `pthread_mutexattr_setprioceiling`:idx: - `posix.html#935 `_ - - `pthread_mutexattr_setprotocol`:idx: - `posix.html#936 `_ - - `pthread_mutexattr_setpshared`:idx: - `posix.html#937 `_ - - `pthread_mutexattr_settype`:idx: - `posix.html#938 `_ - - `PTHREAD_MUTEX_DEFAULT`:idx: - `posix.html#462 `_ - - `pthread_mutex_destroy`:idx: - `posix.html#921 `_ - - `PTHREAD_MUTEX_ERRORCHECK`:idx: - `posix.html#463 `_ - - `pthread_mutex_getprioceiling`:idx: - `posix.html#922 `_ - - `pthread_mutex_init`:idx: - `posix.html#923 `_ - - `PTHREAD_MUTEX_INITIALIZER`:idx: - `posix.html#464 `_ - - `pthread_mutex_lock`:idx: - `posix.html#924 `_ - - `PTHREAD_MUTEX_NORMAL`:idx: - `posix.html#465 `_ - - `PTHREAD_MUTEX_RECURSIVE`:idx: - `posix.html#466 `_ - - `pthread_mutex_setprioceiling`:idx: - `posix.html#925 `_ - - `pthread_mutex_timedlock`:idx: - `posix.html#926 `_ - - `pthread_mutex_trylock`:idx: - `posix.html#927 `_ - - `pthread_mutex_unlock`:idx: - `posix.html#928 `_ - - `pthread_once`:idx: - `posix.html#939 `_ - - `PTHREAD_ONCE_INIT`:idx: - `posix.html#467 `_ - - `PTHREAD_PRIO_INHERIT`:idx: - `posix.html#468 `_ - - `PTHREAD_PRIO_NONE`:idx: - `posix.html#469 `_ - - `PTHREAD_PRIO_PROTECT`:idx: - `posix.html#470 `_ - - `PTHREAD_PROCESS_PRIVATE`:idx: - `posix.html#472 `_ - - `PTHREAD_PROCESS_SHARED`:idx: - `posix.html#471 `_ - - `pthread_rwlockattr_destroy`:idx: - `posix.html#949 `_ - - `pthread_rwlockattr_getpshared`:idx: - `posix.html#950 `_ - - `pthread_rwlockattr_init`:idx: - `posix.html#951 `_ - - `pthread_rwlockattr_setpshared`:idx: - `posix.html#952 `_ - - `pthread_rwlock_destroy`:idx: - `posix.html#940 `_ - - `pthread_rwlock_init`:idx: - `posix.html#941 `_ - - `pthread_rwlock_rdlock`:idx: - `posix.html#942 `_ - - `pthread_rwlock_timedrdlock`:idx: - `posix.html#943 `_ - - `pthread_rwlock_timedwrlock`:idx: - `posix.html#944 `_ - - `pthread_rwlock_tryrdlock`:idx: - `posix.html#945 `_ - - `pthread_rwlock_trywrlock`:idx: - `posix.html#946 `_ - - `pthread_rwlock_unlock`:idx: - `posix.html#947 `_ - - `pthread_rwlock_wrlock`:idx: - `posix.html#948 `_ - - `PTHREAD_SCOPE_PROCESS`:idx: - `posix.html#473 `_ - - `PTHREAD_SCOPE_SYSTEM`:idx: - `posix.html#474 `_ - - `pthread_self`:idx: - `posix.html#953 `_ - - `pthread_setcancelstate`:idx: - `posix.html#954 `_ - - `pthread_setcanceltype`:idx: - `posix.html#955 `_ - - `pthread_setconcurrency`:idx: - `posix.html#956 `_ - - `pthread_setschedparam`:idx: - `posix.html#957 `_ - - `pthread_setschedprio`:idx: - `posix.html#958 `_ - - `pthread_setspecific`:idx: - `posix.html#959 `_ - - `pthread_sigmask`:idx: - `posix.html#1126 `_ - - `pthread_spin_destroy`:idx: - `posix.html#960 `_ - - `pthread_spin_init`:idx: - `posix.html#961 `_ - - `pthread_spin_lock`:idx: - `posix.html#962 `_ - - `pthread_spin_trylock`:idx: - `posix.html#963 `_ - - `pthread_spin_unlock`:idx: - `posix.html#964 `_ - - `pthread_testcancel`:idx: - `posix.html#965 `_ - - `Pulongf`:idx: - `zlib.html#104 `_ - - `push/pop`:idx: - `manual.html#229 `_ - - `putEnv`:idx: - `os.html#142 `_ - - `PWindow`:idx: - `dialogs.html#101 `_ - - `pwrite`:idx: - `posix.html#1017 `_ - - `Pzip`:idx: - `libzip.html#105 `_ - - `Pzip_file`:idx: - `libzip.html#106 `_ - - `PZipFileStream`:idx: - `zipfiles.html#108 `_ - - `Pzip_source`:idx: - `libzip.html#107 `_ - - `Pzip_stat`:idx: - `libzip.html#103 `_ - - `PZstream`:idx: - `zlib.html#114 `_ - - `quit`:idx: - * `system.html#474 `_ - * `system.html#475 `_ - - `QuitFailure`:idx: - `system.html#473 `_ - - `QuitSuccess`:idx: - `system.html#472 `_ - - `quotation mark`:idx: - `manual.html#128 `_ - - `quoteIfSpaceExists`:idx: - `strutils.html#138 `_ - - `RADIXCHAR`:idx: - `posix.html#439 `_ - - `raise`:idx: - `posix.html#1127 `_ - - `random`:idx: - `math.html#108 `_ - - `randomize`:idx: - `math.html#109 `_ - - `range`:idx: - `system.html#120 `_ - - `re-raised`:idx: - `manual.html#184 `_ - - `read`:idx: - `posix.html#1018 `_ - - `readBool`:idx: - `streams.html#106 `_ - - `readBuffer`:idx: - `system.html#502 `_ - - `ReadBytes`:idx: - `system.html#500 `_ - - `readChar`:idx: - * `system.html#486 `_ - * `streams.html#105 `_ - - `ReadChars`:idx: - `system.html#501 `_ - - `readdir`:idx: - `posix.html#802 `_ - - `readdir_r`:idx: - `posix.html#803 `_ - - `readFile`:idx: - `system.html#488 `_ - - `readFloat32`:idx: - `streams.html#111 `_ - - `readFloat64`:idx: - `streams.html#112 `_ - - `readInt16`:idx: - `streams.html#108 `_ - - `readInt32`:idx: - `streams.html#109 `_ - - `readInt64`:idx: - `streams.html#110 `_ - - `readInt8`:idx: - `streams.html#107 `_ - - `readLine`:idx: - * `system.html#496 `_ - * `streams.html#114 `_ - - `readlink`:idx: - `posix.html#1019 `_ - - `readStr`:idx: - `streams.html#113 `_ - - `realloc`:idx: - `system.html#413 `_ - - `Recursive module dependancies`:idx: - `manual.html#217 `_ - - `register`:idx: - `nimrodc.html#113 `_ - - `removeDir`:idx: - `os.html#137 `_ - - `removeFile`:idx: - `os.html#136 `_ - - `repeatChar`:idx: - `strutils.html#134 `_ - - `replaceStr`:idx: - * `strutils.html#114 `_ - * `strutils.html#115 `_ - - `repr`:idx: - `system.html#371 `_ - - `result`:idx: - * `manual.html#191 `_ - * `manual.html#202 `_ - - `return`:idx: - `manual.html#190 `_ - - `rewinddir`:idx: - `posix.html#804 `_ - - `rmdir`:idx: - `posix.html#1020 `_ - - `R_OK`:idx: - `posix.html#479 `_ - - `round`:idx: - `math.html#116 `_ - - `RTLD_GLOBAL`:idx: - `posix.html#217 `_ - - `RTLD_LAZY`:idx: - `posix.html#215 `_ - - `RTLD_LOCAL`:idx: - `posix.html#218 `_ - - `RTLD_NOW`:idx: - `posix.html#216 `_ - - `safe`:idx: - `manual.html#112 `_ - - `safecall`:idx: - `manual.html#167 `_ - - `sameFile`:idx: - `os.html#148 `_ - - `sameFileContent`:idx: - `os.html#149 `_ - - `SA_NOCLDSTOP`:idx: - `posix.html#754 `_ - - `SA_NOCLDWAIT`:idx: - `posix.html#762 `_ - - `SA_NODEFER`:idx: - `posix.html#763 `_ - - `SA_ONSTACK`:idx: - `posix.html#758 `_ - - `SA_RESETHAND`:idx: - `posix.html#759 `_ - - `SA_RESTART`:idx: - `posix.html#760 `_ - - `SA_SIGINFO`:idx: - `posix.html#761 `_ - - `SC_2_C_BIND`:idx: - `posix.html#519 `_ - - `SC_2_C_DEV`:idx: - `posix.html#520 `_ - - `SC_2_CHAR_TERM`:idx: - `posix.html#521 `_ - - `SC_2_FORT_DEV`:idx: - `posix.html#522 `_ - - `SC_2_FORT_RUN`:idx: - `posix.html#523 `_ - - `SC_2_LOCALEDEF`:idx: - `posix.html#524 `_ - - `SC_2_PBS`:idx: - `posix.html#525 `_ - - `SC_2_PBS_ACCOUNTING`:idx: - `posix.html#526 `_ - - `SC_2_PBS_CHECKPOINT`:idx: - `posix.html#527 `_ - - `SC_2_PBS_LOCATE`:idx: - `posix.html#528 `_ - - `SC_2_PBS_MESSAGE`:idx: - `posix.html#529 `_ - - `SC_2_PBS_TRACK`:idx: - `posix.html#530 `_ - - `SC_2_SW_DEV`:idx: - `posix.html#531 `_ - - `SC_2_UPE`:idx: - `posix.html#532 `_ - - `SC_2_VERSION`:idx: - `posix.html#533 `_ - - `SC_ADVISORY_INFO`:idx: - `posix.html#534 `_ - - `SC_AIO_LISTIO_MAX`:idx: - `posix.html#535 `_ - - `SC_AIO_MAX`:idx: - `posix.html#536 `_ - - `SC_AIO_PRIO_DELTA_MAX`:idx: - `posix.html#537 `_ - - `SC_ARG_MAX`:idx: - `posix.html#538 `_ - - `SC_ASYNCHRONOUS_IO`:idx: - `posix.html#539 `_ - - `SC_ATEXIT_MAX`:idx: - `posix.html#540 `_ - - `SC_BARRIERS`:idx: - `posix.html#541 `_ - - `SC_BC_BASE_MAX`:idx: - `posix.html#542 `_ - - `SC_BC_DIM_MAX`:idx: - `posix.html#543 `_ - - `SC_BC_SCALE_MAX`:idx: - `posix.html#544 `_ - - `SC_BC_STRING_MAX`:idx: - `posix.html#545 `_ - - `SC_CHILD_MAX`:idx: - `posix.html#546 `_ - - `SC_CLK_TCK`:idx: - `posix.html#547 `_ - - `SC_CLOCK_SELECTION`:idx: - `posix.html#548 `_ - - `SC_COLL_WEIGHTS_MAX`:idx: - `posix.html#549 `_ - - `SC_CPUTIME`:idx: - `posix.html#550 `_ - - `SC_DELAYTIMER_MAX`:idx: - `posix.html#551 `_ - - `SC_EXPR_NEST_MAX`:idx: - `posix.html#552 `_ - - `SC_FSYNC`:idx: - `posix.html#553 `_ - - `SC_GETGR_R_SIZE_MAX`:idx: - `posix.html#554 `_ - - `SC_GETPW_R_SIZE_MAX`:idx: - `posix.html#555 `_ - - `SCHED_FIFO`:idx: - `posix.html#770 `_ - - `sched_getparam`:idx: - `posix.html#1154 `_ - - `sched_get_priority_max`:idx: - `posix.html#1152 `_ - - `sched_get_priority_min`:idx: - `posix.html#1153 `_ - - `sched_getscheduler`:idx: - `posix.html#1155 `_ - - `SCHED_OTHER`:idx: - `posix.html#773 `_ - - `SCHED_RR`:idx: - `posix.html#771 `_ - - `sched_rr_get_interval`:idx: - `posix.html#1156 `_ - - `sched_setparam`:idx: - `posix.html#1157 `_ - - `sched_setscheduler`:idx: - `posix.html#1158 `_ - - `SCHED_SPORADIC`:idx: - `posix.html#772 `_ - - `sched_yield`:idx: - `posix.html#1159 `_ - - `SC_HOST_NAME_MAX`:idx: - `posix.html#556 `_ - - `SC_IOV_MAX`:idx: - `posix.html#557 `_ - - `SC_IPV6`:idx: - `posix.html#558 `_ - - `SC_JOB_CONTROL`:idx: - `posix.html#559 `_ - - `SC_LINE_MAX`:idx: - `posix.html#560 `_ - - `SC_LOGIN_NAME_MAX`:idx: - `posix.html#561 `_ - - `SC_MAPPED_FILES`:idx: - `posix.html#562 `_ - - `SC_MEMLOCK`:idx: - `posix.html#563 `_ - - `SC_MEMLOCK_RANGE`:idx: - `posix.html#564 `_ - - `SC_MEMORY_PROTECTION`:idx: - `posix.html#565 `_ - - `SC_MESSAGE_PASSING`:idx: - `posix.html#566 `_ - - `SC_MONOTONIC_CLOCK`:idx: - `posix.html#567 `_ - - `SC_MQ_OPEN_MAX`:idx: - `posix.html#568 `_ - - `SC_MQ_PRIO_MAX`:idx: - `posix.html#569 `_ - - `SC_NGROUPS_MAX`:idx: - `posix.html#570 `_ - - `scope`:idx: - * `manual.html#106 `_ - * `manual.html#218 `_ - - `SC_OPEN_MAX`:idx: - `posix.html#571 `_ - - `SC_PAGE_SIZE`:idx: - `posix.html#572 `_ - - `SC_PRIORITIZED_IO`:idx: - `posix.html#573 `_ - - `SC_PRIORITY_SCHEDULING`:idx: - `posix.html#574 `_ - - `SC_RAW_SOCKETS`:idx: - `posix.html#575 `_ - - `SC_READER_WRITER_LOCKS`:idx: - `posix.html#577 `_ - - `SC_REALTIME_SIGNALS`:idx: - `posix.html#578 `_ - - `SC_RE_DUP_MAX`:idx: - `posix.html#576 `_ - - `SC_REGEXP`:idx: - `posix.html#579 `_ - - `ScriptExt`:idx: - `os.html#108 `_ - - `SC_RTSIG_MAX`:idx: - `posix.html#580 `_ - - `SC_SAVED_IDS`:idx: - `posix.html#581 `_ - - `SC_SEMAPHORES`:idx: - `posix.html#584 `_ - - `SC_SEM_NSEMS_MAX`:idx: - `posix.html#582 `_ - - `SC_SEM_VALUE_MAX`:idx: - `posix.html#583 `_ - - `SC_SHARED_MEMORY_OBJECTS`:idx: - `posix.html#585 `_ - - `SC_SHELL`:idx: - `posix.html#586 `_ - - `SC_SIGQUEUE_MAX`:idx: - `posix.html#587 `_ - - `SC_SPAWN`:idx: - `posix.html#588 `_ - - `SC_SPIN_LOCKS`:idx: - `posix.html#589 `_ - - `SC_SPORADIC_SERVER`:idx: - `posix.html#590 `_ - - `SC_SS_REPL_MAX`:idx: - `posix.html#591 `_ - - `SC_STREAM_MAX`:idx: - `posix.html#592 `_ - - `SC_SYMLOOP_MAX`:idx: - `posix.html#593 `_ - - `SC_SYNCHRONIZED_IO`:idx: - `posix.html#594 `_ - - `SC_THREAD_ATTR_STACKADDR`:idx: - `posix.html#595 `_ - - `SC_THREAD_ATTR_STACKSIZE`:idx: - `posix.html#596 `_ - - `SC_THREAD_CPUTIME`:idx: - `posix.html#597 `_ - - `SC_THREAD_DESTRUCTOR_ITERATIONS`:idx: - `posix.html#598 `_ - - `SC_THREAD_KEYS_MAX`:idx: - `posix.html#599 `_ - - `SC_THREAD_PRIO_INHERIT`:idx: - `posix.html#600 `_ - - `SC_THREAD_PRIO_PROTECT`:idx: - `posix.html#601 `_ - - `SC_THREAD_PRIORITY_SCHEDULING`:idx: - `posix.html#602 `_ - - `SC_THREAD_PROCESS_SHARED`:idx: - `posix.html#603 `_ - - `SC_THREADS`:idx: - `posix.html#608 `_ - - `SC_THREAD_SAFE_FUNCTIONS`:idx: - `posix.html#604 `_ - - `SC_THREAD_SPORADIC_SERVER`:idx: - `posix.html#605 `_ - - `SC_THREAD_STACK_MIN`:idx: - `posix.html#606 `_ - - `SC_THREAD_THREADS_MAX`:idx: - `posix.html#607 `_ - - `SC_TIMEOUTS`:idx: - `posix.html#609 `_ - - `SC_TIMER_MAX`:idx: - `posix.html#610 `_ - - `SC_TIMERS`:idx: - `posix.html#611 `_ - - `SC_TRACE`:idx: - `posix.html#612 `_ - - `SC_TRACE_EVENT_FILTER`:idx: - `posix.html#613 `_ - - `SC_TRACE_EVENT_NAME_MAX`:idx: - `posix.html#614 `_ - - `SC_TRACE_INHERIT`:idx: - `posix.html#615 `_ - - `SC_TRACE_LOG`:idx: - `posix.html#616 `_ - - `SC_TRACE_NAME_MAX`:idx: - `posix.html#617 `_ - - `SC_TRACE_SYS_MAX`:idx: - `posix.html#618 `_ - - `SC_TRACE_USER_EVENT_MAX`:idx: - `posix.html#619 `_ - - `SC_TTY_NAME_MAX`:idx: - `posix.html#620 `_ - - `SC_TYPED_MEMORY_OBJECTS`:idx: - `posix.html#621 `_ - - `SC_TZNAME_MAX`:idx: - `posix.html#622 `_ - - `SC_V6_ILP32_OFF32`:idx: - `posix.html#623 `_ - - `SC_V6_ILP32_OFFBIG`:idx: - `posix.html#624 `_ - - `SC_V6_LP64_OFF64`:idx: - `posix.html#625 `_ - - `SC_V6_LPBIG_OFFBIG`:idx: - `posix.html#626 `_ - - `SC_VERSION`:idx: - `posix.html#627 `_ - - `SC_XBS5_ILP32_OFF32`:idx: - `posix.html#628 `_ - - `SC_XBS5_ILP32_OFFBIG`:idx: - `posix.html#629 `_ - - `SC_XBS5_LP64_OFF64`:idx: - `posix.html#630 `_ - - `SC_XBS5_LPBIG_OFFBIG`:idx: - `posix.html#631 `_ - - `SC_XOPEN_CRYPT`:idx: - `posix.html#632 `_ - - `SC_XOPEN_ENH_I18N`:idx: - `posix.html#633 `_ - - `SC_XOPEN_LEGACY`:idx: - `posix.html#634 `_ - - `SC_XOPEN_REALTIME`:idx: - `posix.html#635 `_ - - `SC_XOPEN_REALTIME_THREADS`:idx: - `posix.html#636 `_ - - `SC_XOPEN_SHM`:idx: - `posix.html#637 `_ - - `SC_XOPEN_STREAMS`:idx: - `posix.html#638 `_ - - `SC_XOPEN_UNIX`:idx: - `posix.html#639 `_ - - `SC_XOPEN_VERSION`:idx: - `posix.html#640 `_ - - `SEEK_CUR`:idx: - `posix.html#776 `_ - - `seekdir`:idx: - `posix.html#805 `_ - - `SEEK_END`:idx: - `posix.html#777 `_ - - `SEEK_SET`:idx: - `posix.html#775 `_ - - `select`:idx: - `posix.html#1166 `_ - - `sem_close`:idx: - `posix.html#1045 `_ - - `sem_destroy`:idx: - `posix.html#1046 `_ - - `SEM_FAILED`:idx: - `posix.html#641 `_ - - `sem_getvalue`:idx: - `posix.html#1047 `_ - - `sem_init`:idx: - `posix.html#1048 `_ - - `sem_open`:idx: - `posix.html#1049 `_ - - `sem_post`:idx: - `posix.html#1050 `_ - - `sem_timedwait`:idx: - `posix.html#1051 `_ - - `sem_trywait`:idx: - `posix.html#1052 `_ - - `sem_unlink`:idx: - `posix.html#1053 `_ - - `sem_wait`:idx: - `posix.html#1054 `_ - - `separate compilation`:idx: - `manual.html#215 `_ - - `seq`:idx: - `system.html#123 `_ - - `seqToPtr`:idx: - `system.html#454 `_ - - `Sequences`:idx: - `manual.html#154 `_ - - `set`:idx: - `system.html#124 `_ - - `set type`:idx: - `manual.html#158 `_ - - `setcontext`:idx: - `posix.html#1190 `_ - - `setCurrentDir`:idx: - `os.html#113 `_ - - `setegid`:idx: - `posix.html#1021 `_ - - `seteuid`:idx: - `posix.html#1022 `_ - - `setFilePos`:idx: - `system.html#506 `_ - - `setgid`:idx: - `posix.html#1023 `_ - - `setgrent`:idx: - `posix.html#839 `_ - - `setLen`:idx: - * `system.html#405 `_ - * `system.html#415 `_ - - `setlocale`:idx: - `posix.html#847 `_ - - `setpgid`:idx: - `posix.html#1024 `_ - - `setpgrp`:idx: - `posix.html#1025 `_ - - `setpwent`:idx: - `posix.html#865 `_ - - `setregid`:idx: - `posix.html#1026 `_ - - `setreuid`:idx: - `posix.html#1027 `_ - - `setsid`:idx: - `posix.html#1028 `_ - - `setuid`:idx: - `posix.html#1029 `_ - - `shl`:idx: - * `system.html#223 `_ - * `system.html#224 `_ - * `system.html#225 `_ - * `system.html#226 `_ - * `system.html#227 `_ - - `shm_open`:idx: - `posix.html#1090 `_ - - `shm_unlink`:idx: - `posix.html#1091 `_ - - `shr`:idx: - * `system.html#218 `_ - * `system.html#219 `_ - * `system.html#220 `_ - * `system.html#221 `_ - * `system.html#222 `_ - - `S_IFBLK`:idx: - `posix.html#650 `_ - - `S_IFCHR`:idx: - `posix.html#651 `_ - - `S_IFDIR`:idx: - `posix.html#654 `_ - - `S_IFIFO`:idx: - `posix.html#652 `_ - - `S_IFLNK`:idx: - `posix.html#655 `_ - - `S_IFMT`:idx: - `posix.html#649 `_ - - `S_IFREG`:idx: - `posix.html#653 `_ - - `S_IFSOCK`:idx: - `posix.html#656 `_ - - `SIGABRT`:idx: - `posix.html#726 `_ - - `sigaction`:idx: - `posix.html#1128 `_ - - `sigaddset`:idx: - `posix.html#1129 `_ - - `SIGALRM`:idx: - `posix.html#727 `_ - - `sigaltstack`:idx: - `posix.html#1130 `_ - - `SIG_BLOCK`:idx: - `posix.html#755 `_ - - `SIGBUS`:idx: - `posix.html#728 `_ - - `SIGCHLD`:idx: - `posix.html#729 `_ - - `SIGCONT`:idx: - `posix.html#730 `_ - - `sigdelset`:idx: - `posix.html#1131 `_ - - `SIG_DFL`:idx: - `posix.html#719 `_ - - `sigemptyset`:idx: - `posix.html#1132 `_ - - `SIG_ERR`:idx: - `posix.html#720 `_ - - `SIGEV_NONE`:idx: - `posix.html#723 `_ - - `SIGEV_SIGNAL`:idx: - `posix.html#724 `_ - - `SIGEV_THREAD`:idx: - `posix.html#725 `_ - - `sigfillset`:idx: - `posix.html#1133 `_ - - `SIGFPE`:idx: - `posix.html#731 `_ - - `sighold`:idx: - `posix.html#1134 `_ - - `SIGHUP`:idx: - `posix.html#732 `_ - - `SIG_IGN`:idx: - `posix.html#722 `_ - - `sigignore`:idx: - `posix.html#1135 `_ - - `SIGILL`:idx: - `posix.html#733 `_ - - `SIGINT`:idx: - `posix.html#734 `_ - - `siginterrupt`:idx: - `posix.html#1136 `_ - - `sigismember`:idx: - `posix.html#1137 `_ - - `SIGKILL`:idx: - `posix.html#735 `_ - - `signal`:idx: - `posix.html#1138 `_ - - `sigpause`:idx: - `posix.html#1139 `_ - - `sigpending`:idx: - `posix.html#1140 `_ - - `SIGPIPE`:idx: - `posix.html#736 `_ - - `SIGPOLL`:idx: - `posix.html#746 `_ - - `sigprocmask`:idx: - `posix.html#1141 `_ - - `SIGPROF`:idx: - `posix.html#747 `_ - - `sigqueue`:idx: - `posix.html#1142 `_ - - `SIGQUIT`:idx: - `posix.html#737 `_ - - `sigrelse`:idx: - `posix.html#1143 `_ - - `SIGSEGV`:idx: - `posix.html#738 `_ - - `sigset`:idx: - `posix.html#1144 `_ - - `SIG_SETMASK`:idx: - `posix.html#757 `_ - - `SIGSTKSZ`:idx: - `posix.html#767 `_ - - `SIGSTOP`:idx: - `posix.html#739 `_ - - `sigsuspend`:idx: - `posix.html#1145 `_ - - `SIGSYS`:idx: - `posix.html#748 `_ - - `SIGTERM`:idx: - `posix.html#740 `_ - - `sigtimedwait`:idx: - `posix.html#1146 `_ - - `SIGTRAP`:idx: - `posix.html#749 `_ - - `SIGTSTP`:idx: - `posix.html#741 `_ - - `SIGTTIN`:idx: - `posix.html#742 `_ - - `SIGTTOU`:idx: - `posix.html#743 `_ - - `SIG_UNBLOCK`:idx: - `posix.html#756 `_ - - `SIGURG`:idx: - `posix.html#750 `_ - - `SIGUSR1`:idx: - `posix.html#744 `_ - - `SIGUSR2`:idx: - `posix.html#745 `_ - - `SIGVTALRM`:idx: - `posix.html#751 `_ - - `sigwait`:idx: - `posix.html#1147 `_ - - `sigwaitinfo`:idx: - `posix.html#1148 `_ - - `SIGXCPU`:idx: - `posix.html#752 `_ - - `SIGXFSZ`:idx: - `posix.html#753 `_ - - `simple assertions`:idx: - `regexprs.html#103 `_ - - `simple statements`:idx: - `manual.html#175 `_ - - `sinh`:idx: - `math.html#124 `_ - - `S_IRGRP`:idx: - `posix.html#662 `_ - - `S_IROTH`:idx: - `posix.html#666 `_ - - `S_IRUSR`:idx: - `posix.html#658 `_ - - `S_IRWXG`:idx: - `posix.html#661 `_ - - `S_IRWXO`:idx: - `posix.html#665 `_ - - `S_IRWXU`:idx: - `posix.html#657 `_ - - `S_ISBLK`:idx: - `posix.html#1067 `_ - - `S_ISCHR`:idx: - `posix.html#1068 `_ - - `S_ISDIR`:idx: - `posix.html#1069 `_ - - `S_ISFIFO`:idx: - `posix.html#1070 `_ - - `S_ISGID`:idx: - `posix.html#670 `_ - - `S_ISLNK`:idx: - `posix.html#1072 `_ - - `S_ISREG`:idx: - `posix.html#1071 `_ - - `S_ISSOCK`:idx: - `posix.html#1073 `_ - - `S_ISUID`:idx: - `posix.html#669 `_ - - `S_ISVTX`:idx: - `posix.html#671 `_ - - `S_IWGRP`:idx: - `posix.html#663 `_ - - `S_IWOTH`:idx: - `posix.html#667 `_ - - `S_IWUSR`:idx: - `posix.html#659 `_ - - `S_IXGRP`:idx: - `posix.html#664 `_ - - `S_IXOTH`:idx: - `posix.html#668 `_ - - `S_IXUSR`:idx: - `posix.html#660 `_ - - `sizeof`:idx: - `system.html#153 `_ - - `sleep`:idx: - `posix.html#1030 `_ - - `split`:idx: - `strutils.html#118 `_ - - `SplitFilename`:idx: - `os.html#125 `_ - - `splitLines`:idx: - `strutils.html#119 `_ - - `splitLinesSeq`:idx: - `strutils.html#120 `_ - - `SplitPath`:idx: - `os.html#121 `_ - - `splitSeq`:idx: - `strutils.html#121 `_ - - `SQL_ACCESS_MODE`:idx: - `odbcsql.html#406 `_ - - `SQL_ADD`:idx: - `odbcsql.html#317 `_ - - `SQLAllocHandle`:idx: - `odbcsql.html#627 `_ - - `SQL_ALL_TYPES`:idx: - `odbcsql.html#492 `_ - - `SQL_API_SQLDESCRIBEPARAM`:idx: - `odbcsql.html#229 `_ - - `SQL_ARD_TYPE`:idx: - `odbcsql.html#494 `_ - - `SQL_ASYNC_ENABLE`:idx: - `odbcsql.html#383 `_ - - `SQL_ATTR_ACCESS_MODE`:idx: - `odbcsql.html#415 `_ - - `SQL_ATTR_APP_PARAM_DESC`:idx: - `odbcsql.html#374 `_ - - `SQL_ATTR_APP_ROW_DESC`:idx: - `odbcsql.html#373 `_ - - `SQL_ATTR_AUTOCOMMIT`:idx: - `odbcsql.html#400 `_ - - `SQL_ATTR_AUTO_IPD`:idx: - `odbcsql.html#371 `_ - - `SQL_ATTR_CONCURRENCY`:idx: - `odbcsql.html#395 `_ - - `SQL_ATTR_CONNECTION_DEAD`:idx: - `odbcsql.html#416 `_ - - `SQL_ATTR_CONNECTION_TIMEOUT`:idx: - `odbcsql.html#417 `_ - - `SQL_ATTR_CURRENT_CATALOG`:idx: - `odbcsql.html#418 `_ - - `SQL_ATTR_CURSOR_SCROLLABLE`:idx: - `odbcsql.html#377 `_ - - `SQL_ATTR_CURSOR_SENSITIVITY`:idx: - `odbcsql.html#378 `_ - - `SQL_ATTR_CURSOR_TYPE`:idx: - `odbcsql.html#394 `_ - - `SQL_ATTR_DISCONNECT_BEHAVIOR`:idx: - `odbcsql.html#419 `_ - - `SQL_ATTR_ENLIST_IN_DTC`:idx: - `odbcsql.html#420 `_ - - `SQL_ATTR_ENLIST_IN_XA`:idx: - `odbcsql.html#421 `_ - - `SQL_ATTR_FETCH_BOOKMARK_PTR`:idx: - `odbcsql.html#396 `_ - - `SQL_ATTR_IMP_PARAM_DESC`:idx: - `odbcsql.html#376 `_ - - `SQL_ATTR_IMP_ROW_DESC`:idx: - `odbcsql.html#375 `_ - - `SQL_ATTR_LOGIN_TIMEOUT`:idx: - `odbcsql.html#422 `_ - - `SQL_ATTR_MAX_ROWS`:idx: - `odbcsql.html#404 `_ - - `SQL_ATTR_METADATA_ID`:idx: - `odbcsql.html#372 `_ - - `SQL_ATTR_ODBC_CURSORS`:idx: - `odbcsql.html#341 `_ - - `SQL_ATTR_ODBC_VERSION`:idx: - `odbcsql.html#240 `_ - - `SQL_ATTR_OUTPUT_NTS`:idx: - `odbcsql.html#370 `_ - - `SQL_ATTR_PACKET_SIZE`:idx: - `odbcsql.html#423 `_ - - `SQL_ATTR_QUIET_MODE`:idx: - `odbcsql.html#424 `_ - - `SQL_ATTR_ROW_ARRAY_SIZE`:idx: - `odbcsql.html#620 `_ - - `SQL_ATTR_ROW_NUMBER`:idx: - `odbcsql.html#401 `_ - - `SQL_ATTR_ROWS_FETCHED_PTR`:idx: - `odbcsql.html#398 `_ - - `SQL_ATTR_ROW_STATUS_PTR`:idx: - `odbcsql.html#397 `_ - - `SQL_ATTR_TRACE`:idx: - `odbcsql.html#425 `_ - - `SQL_ATTR_TRACEFILE`:idx: - `odbcsql.html#426 `_ - - `SQL_ATTR_TRANSLATE_LIB`:idx: - `odbcsql.html#427 `_ - - `SQL_ATTR_TRANSLATE_OPTION`:idx: - `odbcsql.html#428 `_ - - `SQL_ATTR_TXN_ISOLATION`:idx: - `odbcsql.html#403 `_ - - `SQL_ATTR_USE_BOOKMARKS`:idx: - `odbcsql.html#405 `_ - - `SQL_AUTOCOMMIT`:idx: - `odbcsql.html#399 `_ - - `SQL_AUTOCOMMIT_DEFAULT`:idx: - `odbcsql.html#434 `_ - - `SQL_AUTOCOMMIT_OFF`:idx: - `odbcsql.html#432 `_ - - `SQL_AUTOCOMMIT_ON`:idx: - `odbcsql.html#433 `_ - - `SQL_BEST_ROWID`:idx: - `odbcsql.html#523 `_ - - `SQL_BIGINT`:idx: - `odbcsql.html#130 `_ - - `SQL_BINARY`:idx: - `odbcsql.html#127 `_ - - `SQLBindCol`:idx: - `odbcsql.html#652 `_ - - `SQLBindParameter`:idx: - `odbcsql.html#660 `_ - - `SQL_BIND_TYPE`:idx: - `odbcsql.html#384 `_ - - `SQL_BIT`:idx: - `odbcsql.html#132 `_ - - `SQL_BOOKMARK_PERSISTENCE`:idx: - `odbcsql.html#262 `_ - - `SQL_BP_CLOSE`:idx: - `odbcsql.html#264 `_ - - `SQL_BP_DELETE`:idx: - `odbcsql.html#265 `_ - - `SQL_BP_DROP`:idx: - `odbcsql.html#266 `_ - - `SQL_BP_OTHER_HSTMT`:idx: - `odbcsql.html#269 `_ - - `SQL_BP_SCROLL`:idx: - `odbcsql.html#270 `_ - - `SQL_BP_TRANSACTION`:idx: - `odbcsql.html#267 `_ - - `SQL_BP_UPDATE`:idx: - `odbcsql.html#268 `_ - - `SQLBrowseConnect`:idx: - `odbcsql.html#636 `_ - - `SQLBulkOperations`:idx: - `odbcsql.html#650 `_ - - `SQL_CA1_ABSOLUTE`:idx: - `odbcsql.html#282 `_ - - `SQL_CA1_BOOKMARK`:idx: - `odbcsql.html#284 `_ - - `SQL_CA1_BULK_ADD`:idx: - `odbcsql.html#295 `_ - - `SQL_CA1_BULK_DELETE_BY_BOOKMARK`:idx: - `odbcsql.html#297 `_ - - `SQL_CA1_BULK_FETCH_BY_BOOKMARK`:idx: - `odbcsql.html#298 `_ - - `SQL_CA1_BULK_UPDATE_BY_BOOKMARK`:idx: - `odbcsql.html#296 `_ - - `SQL_CA1_LOCK_EXCLUSIVE`:idx: - `odbcsql.html#286 `_ - - `SQL_CA1_LOCK_NO_CHANGE`:idx: - `odbcsql.html#285 `_ - - `SQL_CA1_LOCK_UNLOCK`:idx: - `odbcsql.html#287 `_ - - `SQL_CA1_NEXT`:idx: - `odbcsql.html#281 `_ - - `SQL_CA1_POS_DELETE`:idx: - `odbcsql.html#290 `_ - - `SQL_CA1_POSITIONED_DELETE`:idx: - `odbcsql.html#293 `_ - - `SQL_CA1_POSITIONED_UPDATE`:idx: - `odbcsql.html#292 `_ - - `SQL_CA1_POS_POSITION`:idx: - `odbcsql.html#288 `_ - - `SQL_CA1_POS_REFRESH`:idx: - `odbcsql.html#291 `_ - - `SQL_CA1_POS_UPDATE`:idx: - `odbcsql.html#289 `_ - - `SQL_CA1_RELATIVE`:idx: - `odbcsql.html#283 `_ - - `SQL_CA1_SELECT_FOR_UPDATE`:idx: - `odbcsql.html#294 `_ - - `SQL_CA2_CRC_APPROXIMATE`:idx: - `odbcsql.html#313 `_ - - `SQL_CA2_CRC_EXACT`:idx: - `odbcsql.html#312 `_ - - `SQL_CA2_LOCK_CONCURRENCY`:idx: - `odbcsql.html#300 `_ - - `SQL_CA2_MAX_ROWS_AFFECTS_ALL`:idx: - `odbcsql.html#311 `_ - - `SQL_CA2_MAX_ROWS_CATALOG`:idx: - `odbcsql.html#310 `_ - - `SQL_CA2_MAX_ROWS_DELETE`:idx: - `odbcsql.html#308 `_ - - `SQL_CA2_MAX_ROWS_INSERT`:idx: - `odbcsql.html#307 `_ - - `SQL_CA2_MAX_ROWS_SELECT`:idx: - `odbcsql.html#306 `_ - - `SQL_CA2_MAX_ROWS_UPDATE`:idx: - `odbcsql.html#309 `_ - - `SQL_CA2_OPT_ROWVER_CONCURRENCY`:idx: - `odbcsql.html#301 `_ - - `SQL_CA2_OPT_VALUES_CONCURRENCY`:idx: - `odbcsql.html#302 `_ - - `SQL_CA2_READ_ONLY_CONCURRENCY`:idx: - `odbcsql.html#299 `_ - - `SQL_CA2_SENSITIVITY_ADDITIONS`:idx: - `odbcsql.html#303 `_ - - `SQL_CA2_SENSITIVITY_DELETIONS`:idx: - `odbcsql.html#304 `_ - - `SQL_CA2_SENSITIVITY_UPDATES`:idx: - `odbcsql.html#305 `_ - - `SQL_CA2_SIMULATE_NON_UNIQUE`:idx: - `odbcsql.html#314 `_ - - `SQL_CA2_SIMULATE_TRY_UNIQUE`:idx: - `odbcsql.html#315 `_ - - `SQL_CA2_SIMULATE_UNIQUE`:idx: - `odbcsql.html#316 `_ - - `SQL_CATALOG_NAME`:idx: - `odbcsql.html#545 `_ - - `SQL_C_BINARY`:idx: - `odbcsql.html#212 `_ - - `SQL_C_BIT`:idx: - `odbcsql.html#213 `_ - - `SQL_C_BOOKMARK`:idx: - `odbcsql.html#223 `_ - - `SQL_C_CHAR`:idx: - `odbcsql.html#184 `_ - - `SQL_C_DATE`:idx: - `odbcsql.html#193 `_ - - `SQL_C_DEFAULT`:idx: - `odbcsql.html#190 `_ - - `SQL_C_DOUBLE`:idx: - `odbcsql.html#188 `_ - - `SQL_C_FLOAT`:idx: - `odbcsql.html#187 `_ - - `SQL_C_GUID`:idx: - `odbcsql.html#224 `_ - - `SQL_CHAR`:idx: - `odbcsql.html#136 `_ - - `SQL_C_INTERVAL_DAY`:idx: - `odbcsql.html#201 `_ - - `SQL_C_INTERVAL_DAY_TO_HOUR`:idx: - `odbcsql.html#206 `_ - - `SQL_C_INTERVAL_DAY_TO_MINUTE`:idx: - `odbcsql.html#207 `_ - - `SQL_C_INTERVAL_DAY_TO_SECOND`:idx: - `odbcsql.html#208 `_ - - `SQL_C_INTERVAL_HOUR`:idx: - `odbcsql.html#202 `_ - - `SQL_C_INTERVAL_HOUR_TO_MINUTE`:idx: - `odbcsql.html#209 `_ - - `SQL_C_INTERVAL_HOUR_TO_SECOND`:idx: - `odbcsql.html#210 `_ - - `SQL_C_INTERVAL_MINUTE`:idx: - `odbcsql.html#203 `_ - - `SQL_C_INTERVAL_MINUTE_TO_SECOND`:idx: - `odbcsql.html#211 `_ - - `SQL_C_INTERVAL_MONTH`:idx: - `odbcsql.html#200 `_ - - `SQL_C_INTERVAL_SECOND`:idx: - `odbcsql.html#204 `_ - - `SQL_C_INTERVAL_YEAR`:idx: - `odbcsql.html#199 `_ - - `SQL_C_INTERVAL_YEAR_TO_MONTH`:idx: - `odbcsql.html#205 `_ - - `SQL_C_LONG`:idx: - `odbcsql.html#185 `_ - - `SQL_CLOSE`:idx: - `odbcsql.html#503 `_ - - `SQLCloseCursor`:idx: - `odbcsql.html#639 `_ - - `SQL_C_NUMERIC`:idx: - `odbcsql.html#189 `_ - - `SQL_CODE_DATE`:idx: - `odbcsql.html#495 `_ - - `SQL_CODE_DAY`:idx: - `odbcsql.html#156 `_ - - `SQL_CODE_DAY_TO_HOUR`:idx: - `odbcsql.html#161 `_ - - `SQL_CODE_DAY_TO_MINUTE`:idx: - `odbcsql.html#162 `_ - - `SQL_CODE_DAY_TO_SECOND`:idx: - `odbcsql.html#163 `_ - - `SQL_CODE_HOUR`:idx: - `odbcsql.html#157 `_ - - `SQL_CODE_HOUR_TO_MINUTE`:idx: - `odbcsql.html#164 `_ - - `SQL_CODE_HOUR_TO_SECOND`:idx: - `odbcsql.html#165 `_ - - `SQL_CODE_MINUTE`:idx: - `odbcsql.html#158 `_ - - `SQL_CODE_MINUTE_TO_SECOND`:idx: - `odbcsql.html#166 `_ - - `SQL_CODE_MONTH`:idx: - `odbcsql.html#155 `_ - - `SQL_CODE_SECOND`:idx: - `odbcsql.html#159 `_ - - `SQL_CODE_TIME`:idx: - `odbcsql.html#496 `_ - - `SQL_CODE_TIMESTAMP`:idx: - `odbcsql.html#497 `_ - - `SQL_CODE_YEAR`:idx: - `odbcsql.html#154 `_ - - `SQL_CODE_YEAR_TO_MONTH`:idx: - `odbcsql.html#160 `_ - - `SQL_COLATT_OPT_MAX`:idx: - `odbcsql.html#588 `_ - - `SQLColAttribute`:idx: - `odbcsql.html#662 `_ - - `SQL_COLLATION_SEQ`:idx: - `odbcsql.html#546 `_ - - `SQL_COLUMN_AUTO_INCREMENT`:idx: - `odbcsql.html#580 `_ - - `SQL_COLUMN_CASE_SENSITIVE`:idx: - `odbcsql.html#581 `_ - - `SQL_COLUMN_COUNT`:idx: - `odbcsql.html#569 `_ - - `SQL_COLUMN_DISPLAY_SIZE`:idx: - `odbcsql.html#575 `_ - - `SQL_COLUMN_DRIVER_START`:idx: - `odbcsql.html#589 `_ - - `SQL_COLUMN_LABEL`:idx: - `odbcsql.html#587 `_ - - `SQL_COLUMN_LENGTH`:idx: - `odbcsql.html#572 `_ - - `SQL_COLUMN_MONEY`:idx: - `odbcsql.html#578 `_ - - `SQL_COLUMN_NAME`:idx: - `odbcsql.html#570 `_ - - `SQL_COLUMN_NULLABLE`:idx: - `odbcsql.html#576 `_ - - `SQL_COLUMN_OWNER_NAME`:idx: - `odbcsql.html#585 `_ - - `SQL_COLUMN_PRECISION`:idx: - `odbcsql.html#573 `_ - - `SQL_COLUMN_QUALIFIER_NAME`:idx: - `odbcsql.html#586 `_ - - `SQLColumns`:idx: - `odbcsql.html#665 `_ - - `SQL_COLUMN_SCALE`:idx: - `odbcsql.html#574 `_ - - `SQL_COLUMN_SEARCHABLE`:idx: - `odbcsql.html#582 `_ - - `SQL_COLUMN_TABLE_NAME`:idx: - `odbcsql.html#584 `_ - - `SQL_COLUMN_TYPE`:idx: - `odbcsql.html#571 `_ - - `SQL_COLUMN_TYPE_NAME`:idx: - `odbcsql.html#583 `_ - - `SQL_COLUMN_UNSIGNED`:idx: - `odbcsql.html#577 `_ - - `SQL_COLUMN_UPDATABLE`:idx: - `odbcsql.html#579 `_ - - `SQL_COMMIT`:idx: - `odbcsql.html#618 `_ - - `SQL_CONCUR_DEFAULT`:idx: - `odbcsql.html#446 `_ - - `SQL_CONCUR_LOCK`:idx: - `odbcsql.html#443 `_ - - `SQL_CONCUR_READ_ONLY`:idx: - `odbcsql.html#442 `_ - - `SQL_CONCURRENCY`:idx: - `odbcsql.html#386 `_ - - `SQL_CONCUR_ROWVER`:idx: - `odbcsql.html#444 `_ - - `SQL_CONCUR_VALUES`:idx: - `odbcsql.html#445 `_ - - `SQLConnect`:idx: - `odbcsql.html#633 `_ - - `SQL_C_SBIGINT`:idx: - `odbcsql.html#214 `_ - - `SQL_C_SHORT`:idx: - `odbcsql.html#186 `_ - - `SQL_C_SLONG`:idx: - `odbcsql.html#217 `_ - - `SQL_C_SSHORT`:idx: - `odbcsql.html#218 `_ - - `SQL_C_STINYINT`:idx: - `odbcsql.html#219 `_ - - `SQL_C_TIME`:idx: - `odbcsql.html#194 `_ - - `SQL_C_TIMESTAMP`:idx: - `odbcsql.html#195 `_ - - `SQL_C_TINYINT`:idx: - `odbcsql.html#216 `_ - - `SQL_C_TYPE_DATE`:idx: - `odbcsql.html#196 `_ - - `SQL_C_TYPE_TIME`:idx: - `odbcsql.html#197 `_ - - `SQL_C_TYPE_TIMESTAMP`:idx: - `odbcsql.html#198 `_ - - `SQL_C_UBIGINT`:idx: - `odbcsql.html#215 `_ - - `SQL_C_ULONG`:idx: - `odbcsql.html#220 `_ - - `SQL_CUR_DEFAULT`:idx: - `odbcsql.html#345 `_ - - `SQL_CURRENT_QUALIFIER`:idx: - `odbcsql.html#412 `_ - - `SQL_CURSOR_DYNAMIC`:idx: - `odbcsql.html#439 `_ - - `SQL_CURSOR_FORWARD_ONLY`:idx: - `odbcsql.html#437 `_ - - `SQL_CURSOR_KEYSET_DRIVEN`:idx: - `odbcsql.html#438 `_ - - `SQL_CURSOR_SENSITIVITY`:idx: - `odbcsql.html#543 `_ - - `SQL_CURSOR_STATIC`:idx: - `odbcsql.html#440 `_ - - `SQL_CURSOR_TYPE`:idx: - `odbcsql.html#385 `_ - - `SQL_CURSOR_TYPE_DEFAULT`:idx: - `odbcsql.html#441 `_ - - `SQL_CUR_USE_DRIVER`:idx: - `odbcsql.html#344 `_ - - `SQL_CUR_USE_IF_NEEDED`:idx: - `odbcsql.html#342 `_ - - `SQL_CUR_USE_ODBC`:idx: - `odbcsql.html#343 `_ - - `SQL_C_USHORT`:idx: - `odbcsql.html#221 `_ - - `SQL_C_UTINYINT`:idx: - `odbcsql.html#222 `_ - - `SQL_C_VARBOOKMARK`:idx: - `odbcsql.html#228 `_ - - `SQL_DATA_AT_EXEC`:idx: - `odbcsql.html#353 `_ - - `SQLDataSources`:idx: - `odbcsql.html#654 `_ - - `SQL_DATE`:idx: - `odbcsql.html#149 `_ - - `SQL_DATE_LEN`:idx: - `odbcsql.html#363 `_ - - `SQL_DATE_STRUCT`:idx: - `odbcsql.html#231 `_ - - `SQL_DATETIME`:idx: - `odbcsql.html#144 `_ - - `SQL_DECIMAL`:idx: - `odbcsql.html#138 `_ - - `SQL_DEFAULT`:idx: - `odbcsql.html#493 `_ - - `SQL_DELETE`:idx: - `odbcsql.html#325 `_ - - `SQL_DELETE_BY_BOOKMARK`:idx: - `odbcsql.html#320 `_ - - `SQL_DESC_ALLOC_TYPE`:idx: - `odbcsql.html#460 `_ - - `SQL_DESC_ARRAY_SIZE`:idx: - `odbcsql.html#590 `_ - - `SQL_DESC_ARRAY_STATUS_PTR`:idx: - `odbcsql.html#591 `_ - - `SQL_DESC_AUTO_UNIQUE_VALUE`:idx: - `odbcsql.html#592 `_ - - `SQL_DESC_BASE_COLUMN_NAME`:idx: - `odbcsql.html#593 `_ - - `SQL_DESC_BASE_TABLE_NAME`:idx: - `odbcsql.html#594 `_ - - `SQL_DESC_BIND_OFFSET_PTR`:idx: - `odbcsql.html#595 `_ - - `SQL_DESC_BIND_TYPE`:idx: - `odbcsql.html#596 `_ - - `SQL_DESC_CASE_SENSITIVE`:idx: - `odbcsql.html#597 `_ - - `SQL_DESC_CATALOG_NAME`:idx: - `odbcsql.html#598 `_ - - `SQL_DESC_CONCISE_TYPE`:idx: - `odbcsql.html#599 `_ - - `SQL_DESC_COUNT`:idx: - `odbcsql.html#447 `_ - - `SQL_DESC_DATA_PTR`:idx: - `odbcsql.html#456 `_ - - `SQL_DESC_DATETIME_INTERVAL_CODE`:idx: - `odbcsql.html#453 `_ - - `SQL_DESC_DATETIME_INTERVAL_PRECISION`:idx: - `odbcsql.html#600 `_ - - `SQL_DESC_DISPLAY_SIZE`:idx: - `odbcsql.html#601 `_ - - `SQL_DESC_FIXED_PREC_SCALE`:idx: - `odbcsql.html#602 `_ - - `SQL_DESC_INDICATOR_PTR`:idx: - `odbcsql.html#455 `_ - - `SQL_DESC_LABEL`:idx: - `odbcsql.html#603 `_ - - `SQL_DESC_LENGTH`:idx: - `odbcsql.html#449 `_ - - `SQL_DESC_LITERAL_PREFIX`:idx: - `odbcsql.html#604 `_ - - `SQL_DESC_LITERAL_SUFFIX`:idx: - `odbcsql.html#605 `_ - - `SQL_DESC_LOCAL_TYPE_NAME`:idx: - `odbcsql.html#606 `_ - - `SQL_DESC_MAXIMUM_SCALE`:idx: - `odbcsql.html#607 `_ - - `SQL_DESC_MINIMUM_SCALE`:idx: - `odbcsql.html#608 `_ - - `SQL_DESC_NAME`:idx: - `odbcsql.html#457 `_ - - `SQL_DESC_NULLABLE`:idx: - `odbcsql.html#454 `_ - - `SQL_DESC_NUM_PREC_RADIX`:idx: - `odbcsql.html#609 `_ - - `SQL_DESC_OCTET_LENGTH`:idx: - `odbcsql.html#459 `_ - - `SQL_DESC_OCTET_LENGTH_PTR`:idx: - `odbcsql.html#450 `_ - - `SQL_DESC_PARAMETER_TYPE`:idx: - `odbcsql.html#610 `_ - - `SQL_DESC_PRECISION`:idx: - `odbcsql.html#451 `_ - - `SQLDescribeCol`:idx: - `odbcsql.html#643 `_ - - `SQL_DESCRIBE_PARAMETER`:idx: - `odbcsql.html#544 `_ - - `SQL_DESC_ROWS_PROCESSED_PTR`:idx: - `odbcsql.html#611 `_ - - `SQL_DESC_SCALE`:idx: - `odbcsql.html#452 `_ - - `SQL_DESC_SCHEMA_NAME`:idx: - `odbcsql.html#612 `_ - - `SQL_DESC_SEARCHABLE`:idx: - `odbcsql.html#613 `_ - - `SQL_DESC_TABLE_NAME`:idx: - `odbcsql.html#615 `_ - - `SQL_DESC_TYPE`:idx: - `odbcsql.html#448 `_ - - `SQL_DESC_TYPE_NAME`:idx: - `odbcsql.html#614 `_ - - `SQL_DESC_UNNAMED`:idx: - `odbcsql.html#458 `_ - - `SQL_DESC_UNSIGNED`:idx: - `odbcsql.html#616 `_ - - `SQL_DESC_UPDATABLE`:idx: - `odbcsql.html#617 `_ - - `SQL_DIAG_ALTER_TABLE`:idx: - `odbcsql.html#473 `_ - - `SQL_DIAG_CLASS_ORIGIN`:idx: - `odbcsql.html#468 `_ - - `SQL_DIAG_CONNECTION_NAME`:idx: - `odbcsql.html#470 `_ - - `SQL_DIAG_CREATE_INDEX`:idx: - `odbcsql.html#474 `_ - - `SQL_DIAG_CREATE_TABLE`:idx: - `odbcsql.html#475 `_ - - `SQL_DIAG_CREATE_VIEW`:idx: - `odbcsql.html#476 `_ - - `SQL_DIAG_DELETE_WHERE`:idx: - `odbcsql.html#477 `_ - - `SQL_DIAG_DROP_INDEX`:idx: - `odbcsql.html#478 `_ - - `SQL_DIAG_DROP_TABLE`:idx: - `odbcsql.html#479 `_ - - `SQL_DIAG_DROP_VIEW`:idx: - `odbcsql.html#480 `_ - - `SQL_DIAG_DYNAMIC_DELETE_CURSOR`:idx: - `odbcsql.html#481 `_ - - `SQL_DIAG_DYNAMIC_FUNCTION`:idx: - `odbcsql.html#467 `_ - - `SQL_DIAG_DYNAMIC_FUNCTION_CODE`:idx: - `odbcsql.html#472 `_ - - `SQL_DIAG_DYNAMIC_UPDATE_CURSOR`:idx: - `odbcsql.html#482 `_ - - `SQL_DIAG_GRANT`:idx: - `odbcsql.html#483 `_ - - `SQL_DIAG_INSERT`:idx: - `odbcsql.html#484 `_ - - `SQL_DIAG_MESSAGE_TEXT`:idx: - `odbcsql.html#466 `_ - - `SQL_DIAG_NATIVE`:idx: - `odbcsql.html#465 `_ - - `SQL_DIAG_NUMBER`:idx: - `odbcsql.html#462 `_ - - `SQL_DIAG_RETURNCODE`:idx: - `odbcsql.html#461 `_ - - `SQL_DIAG_REVOKE`:idx: - `odbcsql.html#485 `_ - - `SQL_DIAG_ROW_COUNT`:idx: - `odbcsql.html#463 `_ - - `SQL_DIAG_SELECT_CURSOR`:idx: - `odbcsql.html#486 `_ - - `SQL_DIAG_SERVER_NAME`:idx: - `odbcsql.html#471 `_ - - `SQL_DIAG_SQLSTATE`:idx: - `odbcsql.html#464 `_ - - `SQL_DIAG_SUBCLASS_ORIGIN`:idx: - `odbcsql.html#469 `_ - - `SQL_DIAG_UNKNOWN_STATEMENT`:idx: - `odbcsql.html#487 `_ - - `SQL_DIAG_UPDATE_WHERE`:idx: - `odbcsql.html#488 `_ - - `SQLDisconnect`:idx: - `odbcsql.html#634 `_ - - `SQL_DOUBLE`:idx: - `odbcsql.html#143 `_ - - `SQL_DRIVER_COMPLETE`:idx: - `odbcsql.html#242 `_ - - `SQL_DRIVER_COMPLETE_REQUIRED`:idx: - `odbcsql.html#244 `_ - - `SQLDriverConnect`:idx: - `odbcsql.html#635 `_ - - `SQL_DRIVER_NOPROMPT`:idx: - `odbcsql.html#241 `_ - - `SQL_DRIVER_PROMPT`:idx: - `odbcsql.html#243 `_ - - `SQLDrivers`:idx: - `odbcsql.html#655 `_ - - `SQL_DROP`:idx: - `odbcsql.html#504 `_ - - `SQL_DYNAMIC_CURSOR_ATTRIBUTES1`:idx: - `odbcsql.html#271 `_ - - `SQL_DYNAMIC_CURSOR_ATTRIBUTES2`:idx: - `odbcsql.html#272 `_ - - `SQLEndTran`:idx: - `odbcsql.html#663 `_ - - `SQL_ENSURE`:idx: - `odbcsql.html#529 `_ - - `SQL_ERROR`:idx: - `odbcsql.html#357 `_ - - `SQLExecDirect`:idx: - `odbcsql.html#637 `_ - - `SQLExecute`:idx: - `odbcsql.html#640 `_ - - `SQLExtendedFetch`:idx: - `odbcsql.html#645 `_ - - `SQL_FALSE`:idx: - `odbcsql.html#498 `_ - - `SQLFetch`:idx: - `odbcsql.html#641 `_ - - `SQL_FETCH_ABSOLUTE`:idx: - `odbcsql.html#513 `_ - - `SQL_FETCH_BOOKMARK`:idx: - `odbcsql.html#250 `_ - - `SQL_FETCH_BY_BOOKMARK`:idx: - `odbcsql.html#321 `_ - - `SQL_FETCH_FIRST`:idx: - `odbcsql.html#508 `_ - - `SQL_FETCH_FIRST_SYSTEM`:idx: - `odbcsql.html#510 `_ - - `SQL_FETCH_FIRST_USER`:idx: - `odbcsql.html#509 `_ - - `SQL_FETCH_LAST`:idx: - `odbcsql.html#511 `_ - - `SQL_FETCH_NEXT`:idx: - `odbcsql.html#507 `_ - - `SQL_FETCH_PRIOR`:idx: - `odbcsql.html#512 `_ - - `SQL_FETCH_RELATIVE`:idx: - `odbcsql.html#514 `_ - - `SQLFetchScroll`:idx: - `odbcsql.html#644 `_ - - `SQL_FLOAT`:idx: - `odbcsql.html#141 `_ - - `SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1`:idx: - `odbcsql.html#273 `_ - - `SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2`:idx: - `odbcsql.html#274 `_ - - `SQLFreeHandle`:idx: - `odbcsql.html#630 `_ - - `SQLFreeStmt`:idx: - `odbcsql.html#661 `_ - - `SQL_GET_BOOKMARK`:idx: - `odbcsql.html#392 `_ - - `SQLGetCursorName`:idx: - `odbcsql.html#657 `_ - - `SQLGetData`:idx: - `odbcsql.html#646 `_ - - `SQLGetDiagField`:idx: - `odbcsql.html#632 `_ - - `SQLGetDiagRec`:idx: - `odbcsql.html#631 `_ - - `SQLGetEnvAttr`:idx: - `odbcsql.html#629 `_ - - `SQLGetInfo`:idx: - `odbcsql.html#649 `_ - - `SQLGetStmtAttr`:idx: - `odbcsql.html#648 `_ - - `SQL_GUID`:idx: - `odbcsql.html#153 `_ - - `SQL_HANDLE_DBC`:idx: - `odbcsql.html#367 `_ - - `SQL_HANDLE_DESC`:idx: - `odbcsql.html#369 `_ - - `SQL_HANDLE_ENV`:idx: - `odbcsql.html#366 `_ - - `SQL_HANDLE_STMT`:idx: - `odbcsql.html#368 `_ - - `SQL_INDEX_ALL`:idx: - `odbcsql.html#527 `_ - - `SQL_INDEX_CLUSTERED`:idx: - `odbcsql.html#531 `_ - - `SQL_INDEX_HASHED`:idx: - `odbcsql.html#532 `_ - - `SQL_INDEX_KEYWORDS`:idx: - `odbcsql.html#275 `_ - - `SQL_INDEX_OTHER`:idx: - `odbcsql.html#533 `_ - - `SQL_INDEX_UNIQUE`:idx: - `odbcsql.html#526 `_ - - `SQL_INFO_SCHEMA_VIEWS`:idx: - `odbcsql.html#276 `_ - - `SQL_INSENSITIVE`:idx: - `odbcsql.html#490 `_ - - `SQL_INTEGER`:idx: - `odbcsql.html#139 `_ - - `SQL_INTERVAL`:idx: - `odbcsql.html#152 `_ - - `SQL_INTERVAL_DAY`:idx: - `odbcsql.html#169 `_ - - `SQL_INTERVAL_DAY_TO_HOUR`:idx: - `odbcsql.html#174 `_ - - `SQL_INTERVAL_DAY_TO_MINUTE`:idx: - `odbcsql.html#175 `_ - - `SQL_INTERVAL_DAY_TO_SECOND`:idx: - `odbcsql.html#176 `_ - - `SQL_INTERVAL_HOUR`:idx: - `odbcsql.html#170 `_ - - `SQL_INTERVAL_HOUR_TO_MINUTE`:idx: - `odbcsql.html#177 `_ - - `SQL_INTERVAL_HOUR_TO_SECOND`:idx: - `odbcsql.html#178 `_ - - `SQL_INTERVAL_MINUTE`:idx: - `odbcsql.html#171 `_ - - `SQL_INTERVAL_MINUTE_TO_SECOND`:idx: - `odbcsql.html#179 `_ - - `SQL_INTERVAL_MONTH`:idx: - `odbcsql.html#168 `_ - - `SQL_INTERVAL_SECOND`:idx: - `odbcsql.html#172 `_ - - `SQL_INTERVAL_YEAR`:idx: - `odbcsql.html#167 `_ - - `SQL_INTERVAL_YEAR_TO_MONTH`:idx: - `odbcsql.html#173 `_ - - `SQL_INVALID_HANDLE`:idx: - `odbcsql.html#358 `_ - - `SQL_IS_INTEGER`:idx: - `odbcsql.html#247 `_ - - `SQL_IS_POINTER`:idx: - `odbcsql.html#245 `_ - - `SQL_IS_SMALLINT`:idx: - `odbcsql.html#249 `_ - - `SQL_IS_UINTEGER`:idx: - `odbcsql.html#246 `_ - - `SQL_IS_USMALLINT`:idx: - `odbcsql.html#248 `_ - - `SQL_KEYSET_CURSOR_ATTRIBUTES1`:idx: - `odbcsql.html#277 `_ - - `SQL_KEYSET_CURSOR_ATTRIBUTES2`:idx: - `odbcsql.html#278 `_ - - `SQL_KEYSET_SIZE`:idx: - `odbcsql.html#387 `_ - - `SQL_LOCK_EXCLUSIVE`:idx: - `odbcsql.html#327 `_ - - `SQL_LOCK_NO_CHANGE`:idx: - `odbcsql.html#326 `_ - - `SQL_LOCK_UNLOCK`:idx: - `odbcsql.html#328 `_ - - `SQL_LOGIN_TIMEOUT`:idx: - `odbcsql.html#407 `_ - - `SQL_LONGVARBINARY`:idx: - `odbcsql.html#129 `_ - - `SQL_LONGVARCHAR`:idx: - `odbcsql.html#126 `_ - - `SQL_MAX_DSN_LENGTH`:idx: - `odbcsql.html#338 `_ - - `SQL_MAX_IDENTIFIER_LEN`:idx: - `odbcsql.html#547 `_ - - `SQL_MAXIMUM_IDENTIFIER_LENGTH`:idx: - `odbcsql.html#548 `_ - - `SQL_MAX_LENGTH`:idx: - `odbcsql.html#382 `_ - - `SQL_MAX_MESSAGE_LENGTH`:idx: - `odbcsql.html#362 `_ - - `SQL_MAX_OPTION_STRING_LENGTH`:idx: - `odbcsql.html#339 `_ - - `SQL_MAX_ROWS`:idx: - `odbcsql.html#380 `_ - - `SQL_MODE_DEFAULT`:idx: - `odbcsql.html#431 `_ - - `SQL_MODE_READ_ONLY`:idx: - `odbcsql.html#430 `_ - - `SQL_MODE_READ_WRITE`:idx: - `odbcsql.html#429 `_ - - `SQL_NAME_LEN`:idx: - `odbcsql.html#237 `_ - - `SQL_NEED_DATA`:idx: - `odbcsql.html#360 `_ - - `SQL_NO_DATA`:idx: - `odbcsql.html#356 `_ - - `SQL_NONSCROLLABLE`:idx: - `odbcsql.html#435 `_ - - `SQL_NO_NULLS`:idx: - `odbcsql.html#500 `_ - - `SQL_NOSCAN`:idx: - `odbcsql.html#381 `_ - - `SQL_NO_TOTAL`:idx: - `odbcsql.html#230 `_ - - `SQL_NTS`:idx: - `odbcsql.html#361 `_ - - `SQL_NULLABLE`:idx: - `odbcsql.html#501 `_ - - `SQL_NULLABLE_UNKNOWN`:idx: - `odbcsql.html#502 `_ - - `SQL_NULL_DATA`:idx: - `odbcsql.html#352 `_ - - `SQL_NULL_HANDLE`:idx: - `odbcsql.html#519 `_ - - `SQL_NULL_HDBC`:idx: - `odbcsql.html#516 `_ - - `SQL_NULL_HDESC`:idx: - `odbcsql.html#518 `_ - - `SQL_NULL_HENV`:idx: - `odbcsql.html#515 `_ - - `SQL_NULL_HSTMT`:idx: - `odbcsql.html#517 `_ - - `SQL_NUMERIC`:idx: - `odbcsql.html#137 `_ - - `SQLNumResultCols`:idx: - `odbcsql.html#642 `_ - - `SQL_ODBC_CURSORS`:idx: - `odbcsql.html#340 `_ - - `SQL_OJ_CAPABILITIES`:idx: - `odbcsql.html#540 `_ - - `SQL_OPT_TRACE`:idx: - `odbcsql.html#408 `_ - - `SQL_OPT_TRACEFILE`:idx: - `odbcsql.html#409 `_ - - `SQL_OUTER_JOIN_CAPABILITIES`:idx: - `odbcsql.html#541 `_ - - `SQL_OV_ODBC2`:idx: - `odbcsql.html#239 `_ - - `SQL_OV_ODBC3`:idx: - `odbcsql.html#238 `_ - - `SQL_PACKET_SIZE`:idx: - `odbcsql.html#414 `_ - - `SQL_PARAM_INPUT`:idx: - `odbcsql.html#347 `_ - - `SQL_PARAM_INPUT_OUTPUT`:idx: - `odbcsql.html#348 `_ - - `SQL_PARAM_OUTPUT`:idx: - `odbcsql.html#350 `_ - - `SQL_PARAM_TYPE_UNKNOWN`:idx: - `odbcsql.html#346 `_ - - `SQL_POSITION`:idx: - `odbcsql.html#322 `_ - - `SQLPrepare`:idx: - `odbcsql.html#638 `_ - - `SQLPrimaryKeys`:idx: - `odbcsql.html#668 `_ - - `SQLProcedureColumns`:idx: - `odbcsql.html#669 `_ - - `SQLProcedures`:idx: - `odbcsql.html#667 `_ - - `SQLPutData`:idx: - `odbcsql.html#651 `_ - - `SQL_QUERY_TIMEOUT`:idx: - `odbcsql.html#379 `_ - - `SQL_QUICK`:idx: - `odbcsql.html#528 `_ - - `SQL_QUIET_MODE`:idx: - `odbcsql.html#413 `_ - - `SQL_REAL`:idx: - `odbcsql.html#142 `_ - - `SQL_REFRESH`:idx: - `odbcsql.html#323 `_ - - `SQL_RESET_PARAMS`:idx: - `odbcsql.html#506 `_ - - `SQL_RESULT_COL`:idx: - `odbcsql.html#349 `_ - - `SQL_RETRIEVE_DATA`:idx: - `odbcsql.html#390 `_ - - `SQL_RETURN_VALUE`:idx: - `odbcsql.html#351 `_ - - `SQL_ROLLBACK`:idx: - `odbcsql.html#619 `_ - - `SQL_ROW_ADDED`:idx: - `odbcsql.html#333 `_ - - `SQLRowCount`:idx: - `odbcsql.html#659 `_ - - `SQL_ROW_DELETED`:idx: - `odbcsql.html#330 `_ - - `SQL_ROW_ERROR`:idx: - `odbcsql.html#334 `_ - - `SQL_ROW_IDENTIFIER`:idx: - `odbcsql.html#525 `_ - - `SQL_ROW_IGNORE`:idx: - `odbcsql.html#337 `_ - - `SQL_ROW_NOROW`:idx: - `odbcsql.html#332 `_ - - `SQL_ROW_NUMBER`:idx: - `odbcsql.html#393 `_ - - `SQL_ROW_PROCEED`:idx: - `odbcsql.html#336 `_ - - `SQL_ROWSET_SIZE`:idx: - `odbcsql.html#388 `_ - - `SQL_ROW_SUCCESS`:idx: - `odbcsql.html#329 `_ - - `SQL_ROW_SUCCESS_WITH_INFO`:idx: - `odbcsql.html#335 `_ - - `SQL_ROW_UPDATED`:idx: - `odbcsql.html#331 `_ - - `SQL_ROWVER`:idx: - `odbcsql.html#524 `_ - - `SQL_SCCO_LOCK`:idx: - `odbcsql.html#550 `_ - - `SQL_SCCO_OPT_ROWVER`:idx: - `odbcsql.html#551 `_ - - `SQL_SCCO_OPT_VALUES`:idx: - `odbcsql.html#552 `_ - - `SQL_SCCO_READ_ONLY`:idx: - `odbcsql.html#549 `_ - - `SQL_SCOPE_CURROW`:idx: - `odbcsql.html#520 `_ - - `SQL_SCOPE_SESSION`:idx: - `odbcsql.html#522 `_ - - `SQL_SCOPE_TRANSACTION`:idx: - `odbcsql.html#521 `_ - - `SQL_SCROLLABLE`:idx: - `odbcsql.html#436 `_ - - `SQL_SCROLL_CONCURRENCY`:idx: - `odbcsql.html#534 `_ - - `SQL_SCROLL_OPTIONS`:idx: - `odbcsql.html#251 `_ - - `SQL_SENSITIVE`:idx: - `odbcsql.html#491 `_ - - `SQLSetConnectAttr`:idx: - `odbcsql.html#656 `_ - - `SQLSetCursorName`:idx: - `odbcsql.html#658 `_ - - `SQLSetEnvAttr`:idx: - `odbcsql.html#628 `_ - - `SQLSetPos`:idx: - `odbcsql.html#653 `_ - - `SQL_SETPOS_MAX_OPTION_VALUE`:idx: - `odbcsql.html#318 `_ - - `SQLSetStmtAttr`:idx: - `odbcsql.html#647 `_ - - `SQL_SIGNED_OFFSET`:idx: - `odbcsql.html#191 `_ - - `SQL_SIMULATE_CURSOR`:idx: - `odbcsql.html#389 `_ - - `SQL_SMALLINT`:idx: - `odbcsql.html#140 `_ - - `SQL_SO_DYNAMIC`:idx: - `odbcsql.html#259 `_ - - `SQL_SO_FORWARD_ONLY`:idx: - `odbcsql.html#257 `_ - - `SQL_SO_KEYSET_DRIVEN`:idx: - `odbcsql.html#258 `_ - - `SQL_SO_MIXED`:idx: - `odbcsql.html#260 `_ - - `SQL_SO_STATIC`:idx: - `odbcsql.html#261 `_ - - `SQLSpecialColumns`:idx: - `odbcsql.html#666 `_ - - `SQL_SS_ADDITIONS`:idx: - `odbcsql.html#566 `_ - - `SQL_SS_DELETIONS`:idx: - `odbcsql.html#567 `_ - - `SQL_SS_UPDATES`:idx: - `odbcsql.html#568 `_ - - `SQL_STATIC_CURSOR_ATTRIBUTES1`:idx: - `odbcsql.html#279 `_ - - `SQL_STATIC_CURSOR_ATTRIBUTES2`:idx: - `odbcsql.html#280 `_ - - `SQL_STATIC_SENSITIVITY`:idx: - `odbcsql.html#263 `_ - - `SQLStatistics`:idx: - `odbcsql.html#670 `_ - - `SQL_STILL_EXECUTING`:idx: - `odbcsql.html#359 `_ - - `SQL_SUCCESS`:idx: - `odbcsql.html#354 `_ - - `SQL_SUCCESS_WITH_INFO`:idx: - `odbcsql.html#355 `_ - - `SQLTables`:idx: - `odbcsql.html#664 `_ - - `SQL_TABLE_STAT`:idx: - `odbcsql.html#530 `_ - - `SQL_TC_ALL`:idx: - `odbcsql.html#555 `_ - - `SQL_TC_DDL_COMMIT`:idx: - `odbcsql.html#556 `_ - - `SQL_TC_DDL_IGNORE`:idx: - `odbcsql.html#557 `_ - - `SQL_TC_DML`:idx: - `odbcsql.html#554 `_ - - `SQL_TC_NONE`:idx: - `odbcsql.html#553 `_ - - `SQL_TIME`:idx: - `odbcsql.html#150 `_ - - `SQL_TIME_LEN`:idx: - `odbcsql.html#364 `_ - - `SQL_TIMESTAMP`:idx: - `odbcsql.html#151 `_ - - `SQL_TIMESTAMP_LEN`:idx: - `odbcsql.html#365 `_ - - `SQL_TIMESTAMP_STRUCT`:idx: - `odbcsql.html#235 `_ - - `SQL_TIME_STRUCT`:idx: - `odbcsql.html#233 `_ - - `SQL_TINYINT`:idx: - `odbcsql.html#131 `_ - - `SQL_TRANSACTION_CAPABLE`:idx: - `odbcsql.html#536 `_ - - `SQL_TRANSACTION_ISOLATION_OPTION`:idx: - `odbcsql.html#539 `_ - - `SQL_TRANSACTION_READ_COMMITTED`:idx: - `odbcsql.html#561 `_ - - `SQL_TRANSACTION_READ_UNCOMMITTED`:idx: - `odbcsql.html#559 `_ - - `SQL_TRANSACTION_REPEATABLE_READ`:idx: - `odbcsql.html#563 `_ - - `SQL_TRANSACTION_SERIALIZABLE`:idx: - `odbcsql.html#565 `_ - - `SQL_TRANSLATE_DLL`:idx: - `odbcsql.html#410 `_ - - `SQL_TRANSLATE_OPTION`:idx: - `odbcsql.html#411 `_ - - `SQL_TRUE`:idx: - `odbcsql.html#499 `_ - - `SQL_TXN_CAPABLE`:idx: - `odbcsql.html#535 `_ - - `SQL_TXN_ISOLATION`:idx: - `odbcsql.html#402 `_ - - `SQL_TXN_ISOLATION_OPTION`:idx: - `odbcsql.html#538 `_ - - `SQL_TXN_READ_COMMITTED`:idx: - `odbcsql.html#560 `_ - - `SQL_TXN_READ_UNCOMMITTED`:idx: - `odbcsql.html#558 `_ - - `SQL_TXN_REPEATABLE_READ`:idx: - `odbcsql.html#562 `_ - - `SQL_TXN_SERIALIZABLE`:idx: - `odbcsql.html#564 `_ - - `SQL_TYPE_DATE`:idx: - `odbcsql.html#146 `_ - - `SQL_TYPE_MAX`:idx: - `odbcsql.html#227 `_ - - `SQL_TYPE_MIN`:idx: - `odbcsql.html#226 `_ - - `SQL_TYPE_NULL`:idx: - `odbcsql.html#225 `_ - - `SQL_TYPE_TIME`:idx: - `odbcsql.html#147 `_ - - `SQL_TYPE_TIMESTAMP`:idx: - `odbcsql.html#148 `_ - - `SQL_UB_DEFAULT`:idx: - `odbcsql.html#254 `_ - - `SQL_UB_FIXED`:idx: - `odbcsql.html#255 `_ - - `SQL_UB_OFF`:idx: - `odbcsql.html#252 `_ - - `SQL_UB_ON`:idx: - `odbcsql.html#253 `_ - - `SQL_UB_VARIABLE`:idx: - `odbcsql.html#256 `_ - - `SQL_UNBIND`:idx: - `odbcsql.html#505 `_ - - `SQL_UNICODE`:idx: - `odbcsql.html#180 `_ - - `SQL_UNICODE_CHAR`:idx: - `odbcsql.html#183 `_ - - `SQL_UNICODE_LONGVARCHAR`:idx: - `odbcsql.html#182 `_ - - `SQL_UNICODE_VARCHAR`:idx: - `odbcsql.html#181 `_ - - `SQL_UNKNOWN_TYPE`:idx: - `odbcsql.html#125 `_ - - `SQL_UNSIGNED_OFFSET`:idx: - `odbcsql.html#192 `_ - - `SQL_UNSPECIFIED`:idx: - `odbcsql.html#489 `_ - - `SQL_UPDATE`:idx: - `odbcsql.html#324 `_ - - `SQL_UPDATE_BY_BOOKMARK`:idx: - `odbcsql.html#319 `_ - - `SQL_USE_BOOKMARKS`:idx: - `odbcsql.html#391 `_ - - `SQL_USER_NAME`:idx: - `odbcsql.html#537 `_ - - `SQL_VARBINARY`:idx: - `odbcsql.html#128 `_ - - `SQL_VARCHAR`:idx: - `odbcsql.html#145 `_ - - `SQL_WCHAR`:idx: - `odbcsql.html#133 `_ - - `SQL_WLONGVARCHAR`:idx: - `odbcsql.html#135 `_ - - `SQL_WVARCHAR`:idx: - `odbcsql.html#134 `_ - - `SQL_XOPEN_CLI_YEAR`:idx: - `odbcsql.html#542 `_ - - `sqrt`:idx: - * `math.html#110 `_ - * `complex.html#109 `_ - - `SS_DISABLE`:idx: - `posix.html#765 `_ - - `SS_ONSTACK`:idx: - `posix.html#764 `_ - - `stack_trace`:idx: - `nimrodc.html#109 `_ - - `startsWith`:idx: - `strutils.html#135 `_ - - `stat`:idx: - `posix.html#1065 `_ - - `Statements`:idx: - `manual.html#174 `_ - - `static error`:idx: - `manual.html#109 `_ - - `static type`:idx: - `manual.html#103 `_ - - `statvfs`:idx: - `posix.html#1056 `_ - - `stdcall`:idx: - `manual.html#165 `_ - - `stderr`:idx: - `system.html#481 `_ - - `STDERR_FILENO`:idx: - `posix.html#127 `_ - - `stdin`:idx: - `system.html#479 `_ - - `STDIN_FILENO`:idx: - `posix.html#128 `_ - - `stdout`:idx: - `system.html#480 `_ - - `STDOUT_FILENO`:idx: - `posix.html#129 `_ - - `ST_NOSUID`:idx: - `posix.html#673 `_ - - `ST_RDONLY`:idx: - `posix.html#672 `_ - - `strerror`:idx: - `posix.html#1160 `_ - - `strfmon`:idx: - `posix.html#848 `_ - - `strftime`:idx: - `posix.html#1110 `_ - - `string`:idx: - * `manual.html#151 `_ - * `system.html#111 `_ - - `strip`:idx: - `strutils.html#105 `_ - - `strptime`:idx: - `posix.html#1111 `_ - - `strStart`:idx: - `strutils.html#103 `_ - - `structured type`:idx: - `manual.html#152 `_ - - `strutils`:idx: - `nimrodc.html#117 `_ - - `style-insensitive`:idx: - `manual.html#118 `_ - - `S_TYPEISMQ`:idx: - `posix.html#1074 `_ - - `S_TYPEISSEM`:idx: - `posix.html#1075 `_ - - `S_TYPEISSHM`:idx: - `posix.html#1076 `_ - - `S_TYPEISTMO`:idx: - `posix.html#1077 `_ - - `subrange`:idx: - `manual.html#150 `_ - - `succ`:idx: - `system.html#154 `_ - - `swab`:idx: - `posix.html#1031 `_ - - `swap`:idx: - `system.html#417 `_ - - `swapcontext`:idx: - `posix.html#1191 `_ - - `symlink`:idx: - `posix.html#1032 `_ - - `sync`:idx: - `posix.html#1033 `_ - - `syscall`:idx: - `manual.html#172 `_ - - `sysconf`:idx: - `posix.html#1034 `_ - - `system`:idx: - `manual.html#219 `_ - - `tabulator`:idx: - `manual.html#125 `_ - - `TAddress`:idx: - `system.html#372 `_ - - `Taiocb`:idx: - `posix.html#204 `_ - - `TAllocfunc`:idx: - `zlib.html#108 `_ - - `tan`:idx: - `math.html#125 `_ - - `tanh`:idx: - `math.html#126 `_ - - `TBaseLexer`:idx: - `lexbase.html#103 `_ - - `Tblkcnt`:idx: - `posix.html#143 `_ - - `Tblksize`:idx: - `posix.html#144 `_ - - `TCfgEvent`:idx: - `parsecfg.html#102 `_ - - `TCfgEventKind`:idx: - `parsecfg.html#101 `_ - - `TCfgParser`:idx: - `parsecfg.html#103 `_ - - `tcgetpgrp`:idx: - `posix.html#1035 `_ - - `TCharSet`:idx: - `strutils.html#101 `_ - - `TClock`:idx: - `posix.html#145 `_ - - `TClockId`:idx: - `posix.html#146 `_ - - `TCmdLineKind`:idx: - `parseopt.html#101 `_ - - `TComplex`:idx: - `complex.html#101 `_ - - `tcsetpgrp`:idx: - `posix.html#1036 `_ - - `TDev`:idx: - `posix.html#147 `_ - - `TDIR`:idx: - `posix.html#130 `_ - - `Tdirent`:idx: - `posix.html#131 `_ - - `telldir`:idx: - `posix.html#806 `_ - - `template`:idx: - `manual.html#210 `_ - - `TEndian`:idx: - `system.html#385 `_ - - `Tfd_set`:idx: - `posix.html#201 `_ - - `Tfenv`:idx: - `posix.html#133 `_ - - `Tfexcept`:idx: - `posix.html#134 `_ - - `TFile`:idx: - `system.html#476 `_ - - `TFileHandle`:idx: - `system.html#478 `_ - - `TFileMode`:idx: - `system.html#477 `_ - - `TFileStream`:idx: - `streams.html#119 `_ - - `TFloatClass`:idx: - `math.html#103 `_ - - `Tflock`:idx: - `posix.html#132 `_ - - `T_FMT`:idx: - `posix.html#392 `_ - - `T_FMT_AMPM`:idx: - `posix.html#393 `_ - - `TFormatFlag`:idx: - `strtabs.html#111 `_ - - `TFreeFunc`:idx: - `zlib.html#109 `_ - - `Tfsblkcnt`:idx: - `posix.html#148 `_ - - `Tfsfilcnt`:idx: - `posix.html#149 `_ - - `TFTW`:idx: - `posix.html#135 `_ - - `TGC_Strategy`:idx: - `system.html#460 `_ - - `TGid`:idx: - `posix.html#150 `_ - - `TGlob`:idx: - `posix.html#136 `_ - - `TGroup`:idx: - `posix.html#137 `_ - - `THash`:idx: - `hashes.html#101 `_ - - `THOUSEP`:idx: - `posix.html#440 `_ - - `Ticonv`:idx: - `posix.html#138 `_ - - `Tid`:idx: - `posix.html#151 `_ - - `time`:idx: - `posix.html#1112 `_ - - `TimeInfoToTime`:idx: - `times.html#108 `_ - - `TIMER_ABSTIME`:idx: - `posix.html#699 `_ - - `timer_create`:idx: - `posix.html#1113 `_ - - `timer_delete`:idx: - `posix.html#1114 `_ - - `timer_getoverrun`:idx: - `posix.html#1116 `_ - - `timer_gettime`:idx: - `posix.html#1115 `_ - - `timer_settime`:idx: - `posix.html#1117 `_ - - `times`:idx: - `nimrodc.html#119 `_ - - `timezone`:idx: - `posix.html#702 `_ - - `Tino`:idx: - `posix.html#152 `_ - - `TInternalState`:idx: - `zlib.html#110 `_ - - `Tipc_perm`:idx: - `posix.html#182 `_ - - `titimerspec`:idx: - `posix.html#188 `_ - - `TKey`:idx: - `posix.html#153 `_ - - `Tlconv`:idx: - `posix.html#139 `_ - - `Tmcontext`:idx: - `posix.html#202 `_ - - `TMode`:idx: - `posix.html#154 `_ - - `TMonth`:idx: - `times.html#101 `_ - - `TMqAttr`:idx: - `posix.html#141 `_ - - `TMqd`:idx: - `posix.html#140 `_ - - `Tnl_catd`:idx: - `posix.html#198 `_ - - `TNlink`:idx: - `posix.html#155 `_ - - `Tnl_item`:idx: - `posix.html#197 `_ - - `toBiggestFloat`:idx: - `system.html#399 `_ - - `toBiggestInt`:idx: - `system.html#401 `_ - - `toBin`:idx: - `strutils.html#140 `_ - - `TObject`:idx: - `system.html#128 `_ - - `TOff`:idx: - `posix.html#156 `_ - - `toFloat`:idx: - `system.html#398 `_ - - `toHex`:idx: - `strutils.html#126 `_ - - `toInt`:idx: - `system.html#400 `_ - - `toLower`:idx: - * `strutils.html#106 `_ - * `strutils.html#107 `_ - - `toOct`:idx: - `strutils.html#139 `_ - - `toOctal`:idx: - `strutils.html#117 `_ - - `TOptParser`:idx: - `parseopt.html#102 `_ - - `toString`:idx: - `strutils.html#131 `_ - - `toU16`:idx: - `system.html#176 `_ - - `toU32`:idx: - `system.html#177 `_ - - `toU8`:idx: - `system.html#175 `_ - - `toUpper`:idx: - * `strutils.html#108 `_ - * `strutils.html#109 `_ - - `TPasswd`:idx: - `posix.html#142 `_ - - `TPathComponent`:idx: - `os.html#154 `_ - - `TPid`:idx: - `posix.html#157 `_ - - `Tposix_spawnattr`:idx: - `posix.html#205 `_ - - `Tposix_spawn_file_actions`:idx: - `posix.html#206 `_ - - `Tposix_typed_mem_info`:idx: - `posix.html#185 `_ - - `Tpthread`:idx: - `posix.html#170 `_ - - `Tpthread_attr`:idx: - `posix.html#158 `_ - - `Tpthread_barrier`:idx: - `posix.html#159 `_ - - `Tpthread_barrierattr`:idx: - `posix.html#160 `_ - - `Tpthread_cond`:idx: - `posix.html#161 `_ - - `Tpthread_condattr`:idx: - `posix.html#162 `_ - - `Tpthread_key`:idx: - `posix.html#163 `_ - - `Tpthread_mutex`:idx: - `posix.html#164 `_ - - `Tpthread_mutexattr`:idx: - `posix.html#165 `_ - - `Tpthread_once`:idx: - `posix.html#166 `_ - - `Tpthread_rwlock`:idx: - `posix.html#167 `_ - - `Tpthread_rwlockattr`:idx: - `posix.html#168 `_ - - `Tpthread_spinlock`:idx: - `posix.html#169 `_ - - `traced`:idx: - `manual.html#160 `_ - - `TResult`:idx: - `system.html#152 `_ - - `truncate`:idx: - `posix.html#1037 `_ - - `try`:idx: - `manual.html#186 `_ - - `Tsched_param`:idx: - `posix.html#199 `_ - - `TSem`:idx: - `posix.html#181 `_ - - `TSigaction`:idx: - `posix.html#193 `_ - - `Tsig_atomic`:idx: - `posix.html#189 `_ - - `TsigEvent`:idx: - `posix.html#191 `_ - - `TsigInfo`:idx: - `posix.html#196 `_ - - `Tsigset`:idx: - `posix.html#190 `_ - - `TSigStack`:idx: - `posix.html#195 `_ - - `TsigVal`:idx: - `posix.html#192 `_ - - `TSqlChar`:idx: - `odbcsql.html#101 `_ - - `TSqlDouble`:idx: - `odbcsql.html#113 `_ - - `TSqlFloat`:idx: - `odbcsql.html#114 `_ - - `TSqlHandle`:idx: - `odbcsql.html#104 `_ - - `TSqlHDBC`:idx: - `odbcsql.html#106 `_ - - `TSqlHDesc`:idx: - `odbcsql.html#108 `_ - - `TSqlHEnv`:idx: - `odbcsql.html#105 `_ - - `TSqlHStmt`:idx: - `odbcsql.html#107 `_ - - `TSqlHWND`:idx: - `odbcsql.html#115 `_ - - `TSqlInteger`:idx: - `odbcsql.html#109 `_ - - `TSqlPointer`:idx: - `odbcsql.html#111 `_ - - `TSqlReal`:idx: - `odbcsql.html#112 `_ - - `TSqlSmallInt`:idx: - `odbcsql.html#102 `_ - - `TSqlUInteger`:idx: - `odbcsql.html#110 `_ - - `TSqlUSmallInt`:idx: - `odbcsql.html#103 `_ - - `TStack`:idx: - `posix.html#194 `_ - - `TStat`:idx: - `posix.html#183 `_ - - `TStatvfs`:idx: - `posix.html#184 `_ - - `TStream`:idx: - `streams.html#102 `_ - - `TStringStream`:idx: - `streams.html#116 `_ - - `TStringTable`:idx: - `strtabs.html#102 `_ - - `TStringTableMode`:idx: - `strtabs.html#101 `_ - - `Tsuseconds`:idx: - `posix.html#171 `_ - - `Ttime`:idx: - `posix.html#172 `_ - - `TTime`:idx: - `times.html#103 `_ - - `TTimeInfo`:idx: - `times.html#104 `_ - - `Ttimer`:idx: - `posix.html#173 `_ - - `Ttimespec`:idx: - `posix.html#187 `_ - - `Ttimeval`:idx: - `posix.html#200 `_ - - `Ttm`:idx: - `posix.html#186 `_ - - `Ttrace_attr`:idx: - `posix.html#174 `_ - - `Ttrace_event_id`:idx: - `posix.html#175 `_ - - `Ttrace_event_set`:idx: - `posix.html#176 `_ - - `Ttrace_id`:idx: - `posix.html#177 `_ - - `ttyname`:idx: - `posix.html#1038 `_ - - `ttyname_r`:idx: - `posix.html#1039 `_ - - `Tucontext`:idx: - `posix.html#203 `_ - - `Tuid`:idx: - `posix.html#178 `_ - - `tuple`:idx: - `manual.html#155 `_ - - `Tuseconds`:idx: - `posix.html#179 `_ - - `Tutsname`:idx: - `posix.html#180 `_ - - `TWeekDay`:idx: - `times.html#102 `_ - - `type`:idx: - * `manual.html#102 `_ - * `manual.html#141 `_ - * `manual.html#207 `_ - - `type parameters`:idx: - `manual.html#209 `_ - - `type suffix`:idx: - `manual.html#138 `_ - - `TZipArchive`:idx: - `zipfiles.html#101 `_ - - `Tzip_source_callback`:idx: - `libzip.html#102 `_ - - `Tzip_source_cmd`:idx: - `libzip.html#101 `_ - - `Tzip_stat`:idx: - `libzip.html#104 `_ - - `tzset`:idx: - `posix.html#1118 `_ - - `TZStream`:idx: - `zlib.html#112 `_ - - `TZStreamRec`:idx: - `zlib.html#113 `_ - - `ualarm`:idx: - `posix.html#1040 `_ - - `Uint`:idx: - `zlib.html#101 `_ - - `Ulong`:idx: - `zlib.html#102 `_ - - `Ulongf`:idx: - `zlib.html#103 `_ - - `umask`:idx: - `posix.html#1066 `_ - - `uname`:idx: - `posix.html#866 `_ - - `unchecked runtime error`:idx: - `manual.html#111 `_ - - `uncompress`:idx: - `zlib.html#156 `_ - - `undef`:idx: - `manual.html#224 `_ - - `UnixToNativePath`:idx: - `os.html#124 `_ - - `unlink`:idx: - `posix.html#1041 `_ - - `unsigned integer`:idx: - `manual.html#143 `_ - - `unsigned operations`:idx: - `manual.html#144 `_ - - `untraced`:idx: - `manual.html#161 `_ - - `usleep`:idx: - `posix.html#1042 `_ - - `Var`:idx: - `manual.html#179 `_ - - `varargs`:idx: - `nimrodc.html#106 `_ - - `variant`:idx: - `manual.html#157 `_ - - `vertical tabulator`:idx: - `manual.html#126 `_ - - `vfork`:idx: - `posix.html#1043 `_ - - `volatile`:idx: - `nimrodc.html#112 `_ - - `wait`:idx: - `posix.html#1119 `_ - - `waitid`:idx: - `posix.html#1120 `_ - - `waitpid`:idx: - `posix.html#1121 `_ - - `walkDir`:idx: - `os.html#155 `_ - - `walkFiles`:idx: - * `os.html#153 `_ - * `zipfiles.html#110 `_ - - `warning`:idx: - * `manual.html#221 `_ - * `manual.html#227 `_ - * `dialogs.html#103 `_ - - `WCONTINUED`:idx: - `posix.html#714 `_ - - `WEXITED`:idx: - `posix.html#712 `_ - - `WEXITSTATUS`:idx: - `posix.html#705 `_ - - `when`:idx: - `manual.html#183 `_ - - `while`:idx: - `manual.html#195 `_ - - `Whitespace`:idx: - `strutils.html#102 `_ - - `WIFCONTINUED`:idx: - `posix.html#706 `_ - - `WIFEXITED`:idx: - `posix.html#707 `_ - - `WIFSIGNALED`:idx: - `posix.html#708 `_ - - `WIFSTOPPED`:idx: - `posix.html#709 `_ - - `WNOHANG`:idx: - `posix.html#703 `_ - - `WNOWAIT`:idx: - `posix.html#715 `_ - - `W_OK`:idx: - `posix.html#480 `_ - - `write`:idx: - * `system.html#489 `_ - * `system.html#490 `_ - * `system.html#491 `_ - * `system.html#492 `_ - * `system.html#493 `_ - * `system.html#494 `_ - * `system.html#495 `_ - * `posix.html#1044 `_ - * `streams.html#103 `_ - * `streams.html#104 `_ - - `writeBuffer`:idx: - `system.html#505 `_ - - `writeBytes`:idx: - `system.html#503 `_ - - `writeChars`:idx: - `system.html#504 `_ - - `writeln`:idx: - * `system.html#497 `_ - * `system.html#498 `_ - - `WSTOPPED`:idx: - `posix.html#713 `_ - - `WSTOPSIG`:idx: - `posix.html#710 `_ - - `WTERMSIG`:idx: - `posix.html#711 `_ - - `WUNTRACED`:idx: - `posix.html#704 `_ - - `X_OK`:idx: - `posix.html#481 `_ - - `xor`:idx: - * `system.html#238 `_ - * `system.html#239 `_ - * `system.html#240 `_ - * `system.html#241 `_ - * `system.html#242 `_ - * `system.html#322 `_ - - `YESEXPR`:idx: - `posix.html#441 `_ - - `yield`:idx: - `manual.html#192 `_ - - `Z_ASCII`:idx: - `zlib.html#138 `_ - - `Z_BEST_COMPRESSION`:idx: - `zlib.html#132 `_ - - `Z_BEST_SPEED`:idx: - `zlib.html#131 `_ - - `Z_BINARY`:idx: - `zlib.html#137 `_ - - `Z_BUF_ERROR`:idx: - `zlib.html#128 `_ - - `Z_DATA_ERROR`:idx: - `zlib.html#126 `_ - - `Z_DEFAULT_COMPRESSION`:idx: - `zlib.html#133 `_ - - `Z_DEFAULT_STRATEGY`:idx: - `zlib.html#136 `_ - - `Z_DEFLATED`:idx: - `zlib.html#140 `_ - - `ze`:idx: - * `system.html#169 `_ - * `system.html#170 `_ - - `ze64`:idx: - * `system.html#171 `_ - * `system.html#172 `_ - * `system.html#173 `_ - * `system.html#174 `_ - - `zeroMem`:idx: - `system.html#407 `_ - - `Z_ERRNO`:idx: - `zlib.html#124 `_ - - `zError`:idx: - `zlib.html#184 `_ - - `Z_FILTERED`:idx: - `zlib.html#134 `_ - - `Z_FINISH`:idx: - `zlib.html#120 `_ - - `Z_FULL_FLUSH`:idx: - `zlib.html#119 `_ - - `Z_HUFFMAN_ONLY`:idx: - `zlib.html#135 `_ - - `zip_add`:idx: - `libzip.html#170 `_ - - `zip_add_dir`:idx: - `libzip.html#171 `_ - - `ZIP_AFL_TORRENT`:idx: - `libzip.html#116 `_ - - `ZIP_CHECKCONS`:idx: - `libzip.html#110 `_ - - `zip_close`:idx: - `libzip.html#172 `_ - - `ZIP_CM_BZIP2`:idx: - `libzip.html#155 `_ - - `ZIP_CM_DEFAULT`:idx: - `libzip.html#144 `_ - - `ZIP_CM_DEFLATE`:idx: - `libzip.html#152 `_ - - `ZIP_CM_DEFLATE64`:idx: - `libzip.html#153 `_ - - `ZIP_CM_IMPLODE`:idx: - `libzip.html#151 `_ - - `ZIP_CM_LZ77`:idx: - `libzip.html#158 `_ - - `ZIP_CM_LZMA`:idx: - `libzip.html#156 `_ - - `ZIP_CM_PKWARE_IMPLODE`:idx: - `libzip.html#154 `_ - - `ZIP_CM_PPMD`:idx: - `libzip.html#160 `_ - - `ZIP_CM_REDUCE_1`:idx: - `libzip.html#147 `_ - - `ZIP_CM_REDUCE_2`:idx: - `libzip.html#148 `_ - - `ZIP_CM_REDUCE_3`:idx: - `libzip.html#149 `_ - - `ZIP_CM_REDUCE_4`:idx: - `libzip.html#150 `_ - - `ZIP_CM_SHRINK`:idx: - `libzip.html#146 `_ - - `ZIP_CM_STORE`:idx: - `libzip.html#145 `_ - - `ZIP_CM_TERSE`:idx: - `libzip.html#157 `_ - - `ZIP_CM_WAVPACK`:idx: - `libzip.html#159 `_ - - `ZIP_CREATE`:idx: - `libzip.html#108 `_ - - `zip_delete`:idx: - `libzip.html#173 `_ - - `ZIP_EM_NONE`:idx: - `libzip.html#161 `_ - - `ZIP_EM_TRAD_PKWARE`:idx: - `libzip.html#162 `_ - - `ZIP_EM_UNKNOWN`:idx: - `libzip.html#163 `_ - - `ZIP_ER_CHANGED`:idx: - `libzip.html#132 `_ - - `ZIP_ER_CLOSE`:idx: - `libzip.html#120 `_ - - `ZIP_ER_COMPNOTSUPP`:idx: - `libzip.html#133 `_ - - `ZIP_ER_CRC`:idx: - `libzip.html#124 `_ - - `ZIP_ER_DELETED`:idx: - `libzip.html#140 `_ - - `ZIP_ER_EOF`:idx: - `libzip.html#134 `_ - - `ZIP_ER_EXISTS`:idx: - `libzip.html#127 `_ - - `ZIP_ER_INCONS`:idx: - `libzip.html#138 `_ - - `ZIP_ER_INTERNAL`:idx: - `libzip.html#137 `_ - - `ZIP_ER_INVAL`:idx: - `libzip.html#135 `_ - - `ZIP_ER_MEMORY`:idx: - `libzip.html#131 `_ - - `ZIP_ER_MULTIDISK`:idx: - `libzip.html#118 `_ - - `ZIP_ER_NOENT`:idx: - `libzip.html#126 `_ - - `ZIP_ER_NOZIP`:idx: - `libzip.html#136 `_ - - `ZIP_ER_OK`:idx: - `libzip.html#117 `_ - - `ZIP_ER_OPEN`:idx: - `libzip.html#128 `_ - - `ZIP_ER_READ`:idx: - `libzip.html#122 `_ - - `ZIP_ER_REMOVE`:idx: - `libzip.html#139 `_ - - `ZIP_ER_RENAME`:idx: - `libzip.html#119 `_ - - `zip_error_clear`:idx: - `libzip.html#174 `_ - - `zip_error_get`:idx: - `libzip.html#175 `_ - - `zip_error_get_sys_type`:idx: - `libzip.html#176 `_ - - `zip_error_to_str`:idx: - `libzip.html#177 `_ - - `ZIP_ER_SEEK`:idx: - `libzip.html#121 `_ - - `ZIP_ER_TMPOPEN`:idx: - `libzip.html#129 `_ - - `ZIP_ER_WRITE`:idx: - `libzip.html#123 `_ - - `ZIP_ER_ZIPCLOSED`:idx: - `libzip.html#125 `_ - - `ZIP_ER_ZLIB`:idx: - `libzip.html#130 `_ - - `ZIP_ET_NONE`:idx: - `libzip.html#141 `_ - - `ZIP_ET_SYS`:idx: - `libzip.html#142 `_ - - `ZIP_ET_ZLIB`:idx: - `libzip.html#143 `_ - - `ZIP_EXCL`:idx: - `libzip.html#109 `_ - - `zip_fclose`:idx: - `libzip.html#178 `_ - - `zip_file_error_clear`:idx: - `libzip.html#179 `_ - - `zip_file_error_get`:idx: - `libzip.html#180 `_ - - `zip_file_strerror`:idx: - `libzip.html#181 `_ - - `ZIP_FL_COMPRESSED`:idx: - `libzip.html#113 `_ - - `ZIP_FL_NOCASE`:idx: - `libzip.html#111 `_ - - `ZIP_FL_NODIR`:idx: - `libzip.html#112 `_ - - `ZIP_FL_RECOMPRESS`:idx: - `libzip.html#115 `_ - - `ZIP_FL_UNCHANGED`:idx: - `libzip.html#114 `_ - - `zip_fopen`:idx: - `libzip.html#182 `_ - - `zip_fopen_index`:idx: - `libzip.html#183 `_ - - `zip_fread`:idx: - `libzip.html#184 `_ - - `zip_get_archive_comment`:idx: - `libzip.html#185 `_ - - `zip_get_archive_flag`:idx: - `libzip.html#186 `_ - - `zip_get_file_comment`:idx: - `libzip.html#187 `_ - - `zip_get_name`:idx: - `libzip.html#188 `_ - - `zip_get_num_files`:idx: - `libzip.html#189 `_ - - `zip_name_locate`:idx: - `libzip.html#190 `_ - - `zip_open`:idx: - `libzip.html#191 `_ - - `zip_rename`:idx: - `libzip.html#192 `_ - - `zip_replace`:idx: - `libzip.html#193 `_ - - `zip_set_archive_comment`:idx: - `libzip.html#194 `_ - - `zip_set_archive_flag`:idx: - `libzip.html#195 `_ - - `zip_set_file_comment`:idx: - `libzip.html#196 `_ - - `zip_source_buffer`:idx: - `libzip.html#197 `_ - - `ZIP_SOURCE_CLOSE`:idx: - `libzip.html#166 `_ - - `ZIP_SOURCE_ERROR`:idx: - `libzip.html#168 `_ - - `zip_source_file`:idx: - `libzip.html#198 `_ - - `zip_source_filep`:idx: - `libzip.html#199 `_ - - `zip_source_free`:idx: - `libzip.html#200 `_ - - `zip_source_function`:idx: - `libzip.html#201 `_ - - `ZIP_SOURCE_OPEN`:idx: - `libzip.html#164 `_ - - `ZIP_SOURCE_READ`:idx: - `libzip.html#165 `_ - - `ZIP_SOURCE_STAT`:idx: - `libzip.html#167 `_ - - `zip_source_zip`:idx: - `libzip.html#202 `_ - - `zip_stat`:idx: - `libzip.html#203 `_ - - `zip_stat_index`:idx: - `libzip.html#204 `_ - - `zip_stat_init`:idx: - `libzip.html#205 `_ - - `zip_strerror`:idx: - `libzip.html#206 `_ - - `zip_unchange`:idx: - `libzip.html#207 `_ - - `zip_unchange_all`:idx: - `libzip.html#208 `_ - - `zip_unchange_archive`:idx: - `libzip.html#209 `_ - - `zlibAllocMem`:idx: - `zlib.html#187 `_ - - `zlibFreeMem`:idx: - `zlib.html#188 `_ - - `zlibVersion`:idx: - `zlib.html#142 `_ - - `Z_MEM_ERROR`:idx: - `zlib.html#127 `_ - - `Z_NEED_DICT`:idx: - `zlib.html#123 `_ - - `Z_NO_COMPRESSION`:idx: - `zlib.html#130 `_ - - `Z_NO_FLUSH`:idx: - `zlib.html#116 `_ - - `Z_NULL`:idx: - `zlib.html#141 `_ - - `z_off_t`:idx: - `zlib.html#105 `_ - - `Z_OK`:idx: - `zlib.html#121 `_ - - `Z_PARTIAL_FLUSH`:idx: - `zlib.html#117 `_ - - `Z_STREAM_END`:idx: - `zlib.html#122 `_ - - `Z_STREAM_ERROR`:idx: - `zlib.html#125 `_ - - `Z_SYNC_FLUSH`:idx: - `zlib.html#118 `_ - - `Z_UNKNOWN`:idx: - `zlib.html#139 `_ - - `Z_VERSION_ERROR`:idx: + +===== +Index +===== + +.. index:: + + + `!=`:idx: + `system.html#351 `_ + + `$`:idx: + * `system.html#422 `_ + * `system.html#423 `_ + * `system.html#424 `_ + * `system.html#425 `_ + * `system.html#426 `_ + * `system.html#427 `_ + * `system.html#428 `_ + * `system.html#429 `_ + * `times.html#109 `_ + * `times.html#110 `_ + + `%`:idx: + * `strutils.html#134 `_ + * `strutils.html#135 `_ + * `strtabs.html#112 `_ + + `%%`:idx: + * `system.html#296 `_ + * `system.html#297 `_ + * `system.html#298 `_ + * `system.html#299 `_ + * `system.html#300 `_ + + `&`:idx: + * `system.html#362 `_ + * `system.html#363 `_ + * `system.html#364 `_ + * `system.html#365 `_ + * `system.html#453 `_ + * `system.html#454 `_ + * `system.html#455 `_ + * `system.html#456 `_ + + `*`:idx: + * `system.html#206 `_ + * `system.html#207 `_ + * `system.html#208 `_ + * `system.html#209 `_ + * `system.html#210 `_ + * `system.html#315 `_ + * `system.html#323 `_ + * `complex.html#107 `_ + + `*%`:idx: + * `system.html#286 `_ + * `system.html#287 `_ + * `system.html#288 `_ + * `system.html#289 `_ + * `system.html#290 `_ + + `+`:idx: + * `system.html#181 `_ + * `system.html#182 `_ + * `system.html#183 `_ + * `system.html#184 `_ + * `system.html#185 `_ + * `system.html#196 `_ + * `system.html#197 `_ + * `system.html#198 `_ + * `system.html#199 `_ + * `system.html#200 `_ + * `system.html#311 `_ + * `system.html#313 `_ + * `system.html#324 `_ + * `complex.html#103 `_ + + `+%`:idx: + * `system.html#276 `_ + * `system.html#277 `_ + * `system.html#278 `_ + * `system.html#279 `_ + * `system.html#280 `_ + + `-`:idx: + * `system.html#186 `_ + * `system.html#187 `_ + * `system.html#188 `_ + * `system.html#189 `_ + * `system.html#190 `_ + * `system.html#201 `_ + * `system.html#202 `_ + * `system.html#203 `_ + * `system.html#204 `_ + * `system.html#205 `_ + * `system.html#312 `_ + * `system.html#314 `_ + * `system.html#325 `_ + * `complex.html#104 `_ + * `complex.html#105 `_ + * `times.html#113 `_ + + `-%`:idx: + * `system.html#281 `_ + * `system.html#282 `_ + * `system.html#283 `_ + * `system.html#284 `_ + * `system.html#285 `_ + + `-+-`:idx: + `system.html#326 `_ + + `/`:idx: + * `system.html#316 `_ + * `os.html#119 `_ + * `complex.html#106 `_ + + `/%`:idx: + * `system.html#291 `_ + * `system.html#292 `_ + * `system.html#293 `_ + * `system.html#294 `_ + * `system.html#295 `_ + + `/../`:idx: + `os.html#123 `_ + + `<`:idx: + * `system.html#256 `_ + * `system.html#257 `_ + * `system.html#258 `_ + * `system.html#259 `_ + * `system.html#260 `_ + * `system.html#319 `_ + * `system.html#343 `_ + * `system.html#344 `_ + * `system.html#345 `_ + * `system.html#346 `_ + * `system.html#347 `_ + * `system.html#348 `_ + * `system.html#349 `_ + * `system.html#350 `_ + * `times.html#114 `_ + + `<%`:idx: + * `system.html#306 `_ + * `system.html#307 `_ + * `system.html#308 `_ + * `system.html#309 `_ + * `system.html#310 `_ + + `<=`:idx: + * `system.html#251 `_ + * `system.html#252 `_ + * `system.html#253 `_ + * `system.html#254 `_ + * `system.html#255 `_ + * `system.html#318 `_ + * `system.html#336 `_ + * `system.html#337 `_ + * `system.html#338 `_ + * `system.html#339 `_ + * `system.html#340 `_ + * `system.html#341 `_ + * `system.html#342 `_ + + `<=`:idx: + `times.html#115 `_ + + `<=%`:idx: + * `system.html#301 `_ + * `system.html#302 `_ + * `system.html#303 `_ + * `system.html#304 `_ + * `system.html#305 `_ + + `==`:idx: + * `system.html#246 `_ + * `system.html#247 `_ + * `system.html#248 `_ + * `system.html#249 `_ + * `system.html#250 `_ + * `system.html#317 `_ + * `system.html#327 `_ + * `system.html#328 `_ + * `system.html#329 `_ + * `system.html#330 `_ + * `system.html#331 `_ + * `system.html#332 `_ + * `system.html#333 `_ + * `system.html#334 `_ + * `system.html#335 `_ + * `system.html#458 `_ + * `complex.html#102 `_ + + `>`:idx: + `system.html#353 `_ + + `>%`:idx: + `system.html#421 `_ + + `>=`:idx: + `system.html#352 `_ + + `>=%`:idx: + `system.html#420 `_ + + `@`:idx: + `system.html#361 `_ + + `[]`:idx: + `strtabs.html#107 `_ + + `[]=`:idx: + `strtabs.html#106 `_ + + `[ESC]`:idx: + `manual.html#134 `_ + + `ABDAY_1`:idx: + `posix.html#403 `_ + + `ABDAY_2`:idx: + `posix.html#404 `_ + + `ABDAY_3`:idx: + `posix.html#405 `_ + + `ABDAY_4`:idx: + `posix.html#406 `_ + + `ABDAY_5`:idx: + `posix.html#407 `_ + + `ABDAY_6`:idx: + `posix.html#408 `_ + + `ABDAY_7`:idx: + `posix.html#409 `_ + + `ABMON_1`:idx: + `posix.html#422 `_ + + `ABMON_10`:idx: + `posix.html#431 `_ + + `ABMON_11`:idx: + `posix.html#432 `_ + + `ABMON_12`:idx: + `posix.html#433 `_ + + `ABMON_2`:idx: + `posix.html#423 `_ + + `ABMON_3`:idx: + `posix.html#424 `_ + + `ABMON_4`:idx: + `posix.html#425 `_ + + `ABMON_5`:idx: + `posix.html#426 `_ + + `ABMON_6`:idx: + `posix.html#427 `_ + + `ABMON_7`:idx: + `posix.html#428 `_ + + `ABMON_8`:idx: + `posix.html#429 `_ + + `ABMON_9`:idx: + `posix.html#430 `_ + + `abs`:idx: + * `system.html#261 `_ + * `system.html#262 `_ + * `system.html#263 `_ + * `system.html#264 `_ + * `system.html#265 `_ + * `system.html#320 `_ + * `complex.html#108 `_ + + `access`:idx: + `posix.html#966 `_ + + `acyclic`:idx: + `nimrodc.html#113 `_ + + `add`:idx: + * `system.html#366 `_ + * `system.html#367 `_ + * `system.html#368 `_ + * `system.html#369 `_ + * `system.html#370 `_ + + `addFile`:idx: + * `zipfiles.html#105 `_ + * `zipfiles.html#106 `_ + * `zipfiles.html#107 `_ + + `addQuitProc`:idx: + `system.html#404 `_ + + `adler32`:idx: + `zlib.html#174 `_ + + `AIO_ALLDONE`:idx: + `posix.html#207 `_ + + `aio_cancel`:idx: + `posix.html#784 `_ + + `AIO_CANCELED`:idx: + `posix.html#208 `_ + + `aio_error`:idx: + `posix.html#785 `_ + + `aio_fsync`:idx: + `posix.html#786 `_ + + `AIO_NOTCANCELED`:idx: + `posix.html#209 `_ + + `aio_read`:idx: + `posix.html#787 `_ + + `aio_return`:idx: + `posix.html#788 `_ + + `aio_suspend`:idx: + `posix.html#789 `_ + + `aio_write`:idx: + `posix.html#790 `_ + + `alarm`:idx: + `posix.html#967 `_ + + `alert`:idx: + `manual.html#131 `_ + + `allCharsInSet`:idx: + `strutils.html#139 `_ + + `alloc`:idx: + `system.html#413 `_ + + `alloc0`:idx: + `system.html#414 `_ + + `ALT_DIGITS`:idx: + `posix.html#438 `_ + + `AltSep`:idx: + `os.html#104 `_ + + `AM_STR`:idx: + `posix.html#394 `_ + + `and`:idx: + * `system.html#116 `_ + * `system.html#231 `_ + * `system.html#232 `_ + * `system.html#233 `_ + * `system.html#234 `_ + * `system.html#235 `_ + + `apostrophe`:idx: + `manual.html#129 `_ + + `AppendFileExt`:idx: + `os.html#131 `_ + + `arccos`:idx: + `math.html#117 `_ + + `arcsin`:idx: + `math.html#118 `_ + + `arctan`:idx: + `math.html#119 `_ + + `arctan2`:idx: + `math.html#120 `_ + + `arithmetic bit shifts`:idx: + `tut1.html#110 `_ + + `array`:idx: + * `tut1.html#117 `_ + * `system.html#124 `_ + + `array properties`:idx: + `tut2.html#105 `_ + + `Arrays`:idx: + `manual.html#152 `_ + + `asctime`:idx: + `posix.html#1092 `_ + + `asctime_r`:idx: + `posix.html#1093 `_ + + `assembler`:idx: + `manual.html#196 `_ + + `assert`:idx: + `system.html#418 `_ + + `Automatic type conversion`:idx: + * `manual.html#144 `_ + * `tut1.html#111 `_ + + `backslash`:idx: + * `manual.html#127 `_ + * `regexprs.html#101 `_ + + `backspace`:idx: + `manual.html#132 `_ + + `basename`:idx: + `posix.html#844 `_ + + `BiggestFloat`:idx: + `system.html#374 `_ + + `BiggestInt`:idx: + `system.html#373 `_ + + `block`:idx: + `manual.html#192 `_ + + `bool`:idx: + `system.html#109 `_ + + `boolean`:idx: + * `manual.html#146 `_ + * `tut1.html#107 `_ + + `break`:idx: + `manual.html#193 `_ + + `breakpoint`:idx: + `endb.html#103 `_ + + `bsd_signal`:idx: + `posix.html#1122 `_ + + `Byte`:idx: + `system.html#128 `_ + + `calling conventions`:idx: + `manual.html#163 `_ + + `capitalize`:idx: + `strutils.html#110 `_ + + `card`:idx: + `system.html#169 `_ + + `carriage return`:idx: + `manual.html#122 `_ + + `case`:idx: + `manual.html#181 `_ + + `catclose`:idx: + `posix.html#1149 `_ + + `catgets`:idx: + `posix.html#1150 `_ + + `catopen`:idx: + `posix.html#1151 `_ + + `cchar`:idx: + `system.html#375 `_ + + `cdecl`:idx: + `manual.html#165 `_ + + `cdouble`:idx: + `system.html#382 `_ + + `cfloat`:idx: + `system.html#381 `_ + + `ChangeFileExt`:idx: + `os.html#132 `_ + + `char`:idx: + `system.html#110 `_ + + `character type`:idx: + `manual.html#147 `_ + + `character with decimal value d`:idx: + `manual.html#130 `_ + + `character with hex value HH`:idx: + `manual.html#135 `_ + + `chdir`:idx: + `posix.html#968 `_ + + `checked runtime error`:idx: + `manual.html#110 `_ + + `chmod`:idx: + `posix.html#1058 `_ + + `ChooseDir`:idx: + `dialogs.html#108 `_ + + `ChooseFilesToOpen`:idx: + `dialogs.html#106 `_ + + `ChooseFileToOpen`:idx: + `dialogs.html#105 `_ + + `ChooseFileToSave`:idx: + `dialogs.html#107 `_ + + `chown`:idx: + `posix.html#969 `_ + + `chr`:idx: + `system.html#171 `_ + + `cint`:idx: + `system.html#378 `_ + + `C_IRGRP`:idx: + `posix.html#104 `_ + + `C_IROTH`:idx: + `posix.html#107 `_ + + `C_IRUSR`:idx: + `posix.html#101 `_ + + `C_ISBLK`:idx: + `posix.html#116 `_ + + `C_ISCHR`:idx: + `posix.html#117 `_ + + `C_ISCTG`:idx: + `posix.html#118 `_ + + `C_ISDIR`:idx: + `posix.html#113 `_ + + `C_ISFIFO`:idx: + `posix.html#114 `_ + + `C_ISGID`:idx: + `posix.html#111 `_ + + `C_ISLNK`:idx: + `posix.html#119 `_ + + `C_ISREG`:idx: + `posix.html#115 `_ + + `C_ISSOCK`:idx: + `posix.html#120 `_ + + `C_ISUID`:idx: + `posix.html#110 `_ + + `C_ISVTX`:idx: + `posix.html#112 `_ + + `C_IWGRP`:idx: + `posix.html#105 `_ + + `C_IWOTH`:idx: + `posix.html#108 `_ + + `C_IWUSR`:idx: + `posix.html#102 `_ + + `C_IXGRP`:idx: + `posix.html#106 `_ + + `C_IXOTH`:idx: + `posix.html#109 `_ + + `C_IXUSR`:idx: + `posix.html#103 `_ + + `classify`:idx: + `math.html#104 `_ + + `clock`:idx: + `posix.html#1094 `_ + + `clock_getcpuclockid`:idx: + `posix.html#1095 `_ + + `clock_getres`:idx: + `posix.html#1096 `_ + + `clock_gettime`:idx: + `posix.html#1097 `_ + + `CLOCK_MONOTONIC`:idx: + `posix.html#700 `_ + + `clock_nanosleep`:idx: + `posix.html#1098 `_ + + `CLOCK_PROCESS_CPUTIME_ID`:idx: + `posix.html#696 `_ + + `CLOCK_REALTIME`:idx: + `posix.html#698 `_ + + `clock_settime`:idx: + `posix.html#1099 `_ + + `CLOCKS_PER_SEC`:idx: + `posix.html#695 `_ + + `CLOCK_THREAD_CPUTIME_ID`:idx: + `posix.html#697 `_ + + `clong`:idx: + `system.html#379 `_ + + `clongdouble`:idx: + `system.html#383 `_ + + `clonglong`:idx: + `system.html#380 `_ + + `close`:idx: + * `posix.html#970 `_ + * `lexbase.html#105 `_ + * `parsecfg.html#105 `_ + * `zipfiles.html#103 `_ + + `closedir`:idx: + `posix.html#800 `_ + + `CloseFile`:idx: + `system.html#488 `_ + + `closure`:idx: + `manual.html#170 `_ + + `cmp`:idx: + * `system.html#359 `_ + * `system.html#360 `_ + + `cmpIgnoreCase`:idx: + `strutils.html#123 `_ + + `cmpIgnoreStyle`:idx: + `strutils.html#124 `_ + + `cmpPaths`:idx: + `os.html#130 `_ + + `CODESET`:idx: + `posix.html#389 `_ + + `comment pieces`:idx: + * `manual.html#115 `_ + * `tut1.html#103 `_ + + `Comments`:idx: + * `manual.html#114 `_ + * `tut1.html#102 `_ + + `CompileDate`:idx: + `system.html#391 `_ + + `CompileTime`:idx: + `system.html#392 `_ + + `complex statements`:idx: + `manual.html#175 `_ + + `compress`:idx: + `zlib.html#154 `_ + + `compress2`:idx: + `zlib.html#155 `_ + + `confstr`:idx: + `posix.html#971 `_ + + `const`:idx: + `manual.html#179 `_ + + `constant expressions`:idx: + `manual.html#108 `_ + + `Constants`:idx: + * `manual.html#139 `_ + * `tut1.html#104 `_ + + `constZIP_SOURCE_FREE`:idx: + `libzip.html#169 `_ + + `contains`:idx: + * `system.html#354 `_ + * `strutils.html#125 `_ + * `strutils.html#126 `_ + * `strutils.html#127 `_ + + `continue`:idx: + `manual.html#195 `_ + + `copy`:idx: + * `system.html#405 `_ + * `system.html#406 `_ + + `copyFile`:idx: + `os.html#134 `_ + + `copyMem`:idx: + `system.html#410 `_ + + `cos`:idx: + `math.html#121 `_ + + `cosh`:idx: + `math.html#122 `_ + + `countBits`:idx: + `math.html#107 `_ + + `countdown`:idx: + `system.html#439 `_ + + `countup`:idx: + `system.html#440 `_ + + `cpuEndian`:idx: + `system.html#397 `_ + + `crc32`:idx: + `zlib.html#175 `_ + + `creat`:idx: + `posix.html#811 `_ + + `createDir`:idx: + * `os.html#138 `_ + * `zipfiles.html#104 `_ + + `CRNCYSTR`:idx: + `posix.html#443 `_ + + `crypt`:idx: + `posix.html#972 `_ + + `cschar`:idx: + `system.html#376 `_ + + `cshort`:idx: + `system.html#377 `_ + + `cSIG_HOLD`:idx: + `posix.html#721 `_ + + `CS_PATH`:idx: + `posix.html#482 `_ + + `CS_POSIX_V6_ILP32_OFF32_CFLAGS`:idx: + `posix.html#483 `_ + + `CS_POSIX_V6_ILP32_OFF32_LDFLAGS`:idx: + `posix.html#484 `_ + + `CS_POSIX_V6_ILP32_OFF32_LIBS`:idx: + `posix.html#485 `_ + + `CS_POSIX_V6_ILP32_OFFBIG_CFLAGS`:idx: + `posix.html#486 `_ + + `CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS`:idx: + `posix.html#487 `_ + + `CS_POSIX_V6_ILP32_OFFBIG_LIBS`:idx: + `posix.html#488 `_ + + `CS_POSIX_V6_LP64_OFF64_CFLAGS`:idx: + `posix.html#489 `_ + + `CS_POSIX_V6_LP64_OFF64_LDFLAGS`:idx: + `posix.html#490 `_ + + `CS_POSIX_V6_LP64_OFF64_LIBS`:idx: + `posix.html#491 `_ + + `CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS`:idx: + `posix.html#492 `_ + + `CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS`:idx: + `posix.html#493 `_ + + `CS_POSIX_V6_LPBIG_OFFBIG_LIBS`:idx: + `posix.html#494 `_ + + `CS_POSIX_V6_WIDTH_RESTRICTED_ENVS`:idx: + `posix.html#495 `_ + + `cstring`:idx: + `system.html#112 `_ + + `cstringArray`:idx: + `system.html#384 `_ + + `ctermid`:idx: + `posix.html#973 `_ + + `ctime`:idx: + `posix.html#1100 `_ + + `ctime_r`:idx: + `posix.html#1101 `_ + + `CurDir`:idx: + `os.html#101 `_ + + `dangling else problem`:idx: + `manual.html#176 `_ + + `DAY_1`:idx: + `posix.html#396 `_ + + `DAY_2`:idx: + `posix.html#397 `_ + + `DAY_3`:idx: + `posix.html#398 `_ + + `DAY_4`:idx: + `posix.html#399 `_ + + `DAY_5`:idx: + `posix.html#400 `_ + + `DAY_6`:idx: + `posix.html#401 `_ + + `DAY_7`:idx: + `posix.html#402 `_ + + `daylight`:idx: + `posix.html#701 `_ + + `dbgLineHook`:idx: + `system.html#435 `_ + + `dead_code_elim`:idx: + `nimrodc.html#114 `_ + + `dealloc`:idx: + `system.html#416 `_ + + `debugger`:idx: + `nimrodc.html#110 `_ + + `dec`:idx: + `system.html#160 `_ + + `define`:idx: + `manual.html#222 `_ + + `defined`:idx: + `system.html#114 `_ + + `deflate`:idx: + `zlib.html#143 `_ + + `deflateCopy`:idx: + `zlib.html#148 `_ + + `deflateEnd`:idx: + `zlib.html#144 `_ + + `deflateInit`:idx: + `zlib.html#178 `_ + + `deflateInit2`:idx: + `zlib.html#182 `_ + + `deflateInit2u`:idx: + `zlib.html#180 `_ + + `deflateInitu`:idx: + `zlib.html#176 `_ + + `deflateParams`:idx: + `zlib.html#150 `_ + + `deflateReset`:idx: + `zlib.html#149 `_ + + `deflateSetDictionary`:idx: + `zlib.html#147 `_ + + `deleteStr`:idx: + `strutils.html#117 `_ + + `D_FMT`:idx: + `posix.html#391 `_ + + `difftime`:idx: + `posix.html#1102 `_ + + `dirname`:idx: + `posix.html#845 `_ + + `DirSep`:idx: + `os.html#103 `_ + + `discard`:idx: + `manual.html#177 `_ + + `div`:idx: + * `system.html#211 `_ + * `system.html#212 `_ + * `system.html#213 `_ + * `system.html#214 `_ + * `system.html#215 `_ + + `dlclose`:idx: + `posix.html#807 `_ + + `dlerror`:idx: + `posix.html#808 `_ + + `dlopen`:idx: + `posix.html#809 `_ + + `dlsym`:idx: + `posix.html#810 `_ + + `dom`:idx: + `nimrodc.html#120 `_ + + `domain specific languages`:idx: + * `manual.html#211 `_ + * `tut2.html#112 `_ + + `D_T_FMT`:idx: + `posix.html#390 `_ + + `dup`:idx: + `posix.html#974 `_ + + `dup2`:idx: + `posix.html#975 `_ + + `dynamic type`:idx: + `manual.html#104 `_ + + `dynlib`:idx: + `nimrodc.html#103 `_ + + `E`:idx: + `math.html#102 `_ + + `E2BIG`:idx: + `posix.html#220 `_ + + `EACCES`:idx: + `posix.html#221 `_ + + `EAccessViolation`:idx: + `system.html#143 `_ + + `EADDRINUSE`:idx: + `posix.html#222 `_ + + `EADDRNOTAVAIL`:idx: + `posix.html#223 `_ + + `EAFNOSUPPORT`:idx: + `posix.html#224 `_ + + `EAGAIN`:idx: + `posix.html#225 `_ + + `EALREADY`:idx: + `posix.html#226 `_ + + `EArithmetic`:idx: + `system.html#140 `_ + + `EAssertionFailed`:idx: + `system.html#144 `_ + + `EAsynch`:idx: + `system.html#134 `_ + + `EBADF`:idx: + `posix.html#227 `_ + + `EBADMSG`:idx: + `posix.html#228 `_ + + `E_Base`:idx: + `system.html#133 `_ + + `EBUSY`:idx: + `posix.html#229 `_ + + `ECANCELED`:idx: + `posix.html#230 `_ + + `ECHILD`:idx: + `posix.html#231 `_ + + `echo`:idx: + * `system.html#474 `_ + * `system.html#475 `_ + + `ECMAScript`:idx: + `nimrodc.html#115 `_ + + `ECONNABORTED`:idx: + `posix.html#232 `_ + + `ECONNREFUSED`:idx: + `posix.html#233 `_ + + `ECONNRESET`:idx: + `posix.html#234 `_ + + `EControlC`:idx: + `system.html#145 `_ + + `EDEADLK`:idx: + `posix.html#235 `_ + + `EDESTADDRREQ`:idx: + `posix.html#236 `_ + + `editDistance`:idx: + `strutils.html#144 `_ + + `EDivByZero`:idx: + `system.html#141 `_ + + `EDOM`:idx: + `posix.html#237 `_ + + `EDQUOT`:idx: + `posix.html#238 `_ + + `EEXIST`:idx: + `posix.html#239 `_ + + `EFAULT`:idx: + `posix.html#240 `_ + + `EFBIG`:idx: + `posix.html#241 `_ + + `EHOSTUNREACH`:idx: + `posix.html#242 `_ + + `EIDRM`:idx: + `posix.html#243 `_ + + `EILSEQ`:idx: + `posix.html#244 `_ + + `EINPROGRESS`:idx: + `posix.html#245 `_ + + `EINTR`:idx: + `posix.html#246 `_ + + `EINVAL`:idx: + `posix.html#247 `_ + + `EInvalidField`:idx: + `system.html#149 `_ + + `EInvalidIndex`:idx: + `system.html#148 `_ + + `EInvalidObjectAssignment`:idx: + `system.html#153 `_ + + `EInvalidObjectConversion`:idx: + `system.html#154 `_ + + `EInvalidRegEx`:idx: + `regexprs.html#104 `_ + + `EInvalidValue`:idx: + `system.html#146 `_ + + `EIO`:idx: + * `posix.html#248 `_ + * `system.html#137 `_ + + `EISCONN`:idx: + `posix.html#249 `_ + + `EISDIR`:idx: + `posix.html#250 `_ + + `ELOOP`:idx: + `posix.html#251 `_ + + `Embedded Nimrod Debugger`:idx: + `endb.html#101 `_ + + `EMFILE`:idx: + `posix.html#252 `_ + + `EMLINK`:idx: + `posix.html#253 `_ + + `EMSGSIZE`:idx: + `posix.html#254 `_ + + `EMULTIHOP`:idx: + `posix.html#255 `_ + + `ENAMETOOLONG`:idx: + `posix.html#256 `_ + + `encrypt`:idx: + `posix.html#976 `_ + + `ENDB`:idx: + `endb.html#102 `_ + + `endgrent`:idx: + `posix.html#838 `_ + + `EndOfFile`:idx: + * `system.html#489 `_ + * `lexbase.html#101 `_ + + `endpwent`:idx: + `posix.html#863 `_ + + `endsWith`:idx: + `strutils.html#138 `_ + + `ENETDOWN`:idx: + `posix.html#257 `_ + + `ENETRESET`:idx: + `posix.html#258 `_ + + `ENETUNREACH`:idx: + `posix.html#259 `_ + + `ENFILE`:idx: + `posix.html#260 `_ + + `ENOBUFS`:idx: + `posix.html#261 `_ + + `ENODATA`:idx: + `posix.html#262 `_ + + `ENODEV`:idx: + `posix.html#263 `_ + + `ENOENT`:idx: + `posix.html#264 `_ + + `ENoExceptionToReraise`:idx: + * `manual.html#184 `_ + * `system.html#152 `_ + + `ENOEXEC`:idx: + `posix.html#265 `_ + + `ENOLCK`:idx: + `posix.html#266 `_ + + `ENOLINK`:idx: + `posix.html#267 `_ + + `ENOMEM`:idx: + `posix.html#268 `_ + + `ENOMSG`:idx: + `posix.html#269 `_ + + `ENOPROTOOPT`:idx: + `posix.html#270 `_ + + `ENOSPC`:idx: + `posix.html#271 `_ + + `ENOSR`:idx: + `posix.html#272 `_ + + `ENOSTR`:idx: + `posix.html#273 `_ + + `ENOSYS`:idx: + `posix.html#274 `_ + + `ENOTCONN`:idx: + `posix.html#275 `_ + + `ENOTDIR`:idx: + `posix.html#276 `_ + + `ENOTEMPTY`:idx: + `posix.html#277 `_ + + `ENOTSOCK`:idx: + `posix.html#278 `_ + + `ENOTSUP`:idx: + `posix.html#279 `_ + + `ENOTTY`:idx: + `posix.html#280 `_ + + `Enumeration`:idx: + `manual.html#148 `_ + + `enumeration`:idx: + `tut1.html#113 `_ + + `ENXIO`:idx: + `posix.html#281 `_ + + `EOPNOTSUPP`:idx: + `posix.html#282 `_ + + `EOS`:idx: + `system.html#138 `_ + + `EOutOfMemory`:idx: + `system.html#147 `_ + + `EOutOfRange`:idx: + * `manual.html#145 `_ + * `tut1.html#112 `_ + * `system.html#150 `_ + + `EOVERFLOW`:idx: + `posix.html#283 `_ + + `EOverflow`:idx: + `system.html#142 `_ + + `EPERM`:idx: + `posix.html#284 `_ + + `EPIPE`:idx: + `posix.html#285 `_ + + `EPROTO`:idx: + `posix.html#286 `_ + + `EPROTONOSUPPORT`:idx: + `posix.html#287 `_ + + `EPROTOTYPE`:idx: + `posix.html#288 `_ + + `equalMem`:idx: + `system.html#412 `_ + + `ERA`:idx: + `posix.html#434 `_ + + `ERA_D_FMT`:idx: + `posix.html#435 `_ + + `ERA_D_T_FMT`:idx: + `posix.html#436 `_ + + `ERANGE`:idx: + `posix.html#289 `_ + + `ERA_T_FMT`:idx: + `posix.html#437 `_ + + `ERessourceExhausted`:idx: + `system.html#139 `_ + + `EROFS`:idx: + `posix.html#290 `_ + + `errno`:idx: + `posix.html#219 `_ + + `error`:idx: + * `dialogs.html#104 `_ + * `manual.html#221 `_ + * `manual.html#224 `_ + + `errorStr`:idx: + `parsecfg.html#110 `_ + + `escape`:idx: + * `manual.html#133 `_ + * `strutils.html#143 `_ + + `escape sequences`:idx: + `manual.html#120 `_ + + `ESPIPE`:idx: + `posix.html#291 `_ + + `ESRCH`:idx: + `posix.html#292 `_ + + `EStackOverflow`:idx: + `system.html#151 `_ + + `ESTALE`:idx: + `posix.html#293 `_ + + `ESynch`:idx: + `system.html#135 `_ + + `ESystem`:idx: + `system.html#136 `_ + + `ETIME`:idx: + `posix.html#294 `_ + + `ETIMEDOUT`:idx: + `posix.html#295 `_ + + `ETXTBSY`:idx: + `posix.html#296 `_ + + `EWOULDBLOCK`:idx: + `posix.html#297 `_ + + `except`:idx: + `manual.html#187 `_ + + `exception handlers`:idx: + `manual.html#186 `_ + + `exceptions`:idx: + `tut2.html#107 `_ + + `excl`:idx: + `system.html#168 `_ + + `EXDEV`:idx: + `posix.html#298 `_ + + `execl`:idx: + `posix.html#977 `_ + + `execle`:idx: + `posix.html#978 `_ + + `execlp`:idx: + `posix.html#979 `_ + + `executeShellCommand`:idx: + `os.html#133 `_ + + `execv`:idx: + `posix.html#980 `_ + + `execve`:idx: + `posix.html#981 `_ + + `execvp`:idx: + `posix.html#982 `_ + + `ExeExt`:idx: + `os.html#107 `_ + + `existsDir`:idx: + `os.html#139 `_ + + `existsEnv`:idx: + `os.html#144 `_ + + `ExistsFile`:idx: + `os.html#117 `_ + + `exp`:idx: + `math.html#114 `_ + + `expandFilename`:idx: + `os.html#116 `_ + + `exportc`:idx: + `nimrodc.html#102 `_ + + `expression macros`:idx: + `tut2.html#113 `_ + + `extractDir`:idx: + `os.html#126 `_ + + `extractFileExt`:idx: + `os.html#128 `_ + + `extractFilename`:idx: + `os.html#127 `_ + + `extractFileTrunk`:idx: + `os.html#129 `_ + + `ExtSep`:idx: + `os.html#109 `_ + + `fastcall`:idx: + `manual.html#168 `_ + + `fatal`:idx: + `manual.html#225 `_ + + `fchdir`:idx: + `posix.html#984 `_ + + `fchmod`:idx: + `posix.html#1059 `_ + + `fchown`:idx: + `posix.html#983 `_ + + `fcntl`:idx: + `posix.html#812 `_ + + `fdatasync`:idx: + `posix.html#985 `_ + + `FD_CLOEXEC`:idx: + `posix.html#309 `_ + + `FD_CLR`:idx: + `posix.html#1161 `_ + + `FD_ISSET`:idx: + `posix.html#1162 `_ + + `FD_SET`:idx: + `posix.html#1163 `_ + + `FD_SETSIZE`:idx: + `posix.html#774 `_ + + `F_DUPFD`:idx: + `posix.html#299 `_ + + `FD_ZERO`:idx: + `posix.html#1164 `_ + + `FE_ALL_EXCEPT`:idx: + `posix.html#337 `_ + + `feclearexcept`:idx: + `posix.html#816 `_ + + `FE_DFL_ENV`:idx: + `posix.html#342 `_ + + `FE_DIVBYZERO`:idx: + `posix.html#332 `_ + + `FE_DOWNWARD`:idx: + `posix.html#338 `_ + + `fegetenv`:idx: + `posix.html#823 `_ + + `fegetexceptflag`:idx: + `posix.html#817 `_ + + `fegetround`:idx: + `posix.html#821 `_ + + `feholdexcept`:idx: + `posix.html#824 `_ + + `FE_INEXACT`:idx: + `posix.html#333 `_ + + `FE_INVALID`:idx: + `posix.html#334 `_ + + `FE_OVERFLOW`:idx: + `posix.html#335 `_ + + `feraiseexcept`:idx: + `posix.html#818 `_ + + `fesetenv`:idx: + `posix.html#825 `_ + + `fesetexceptflag`:idx: + `posix.html#819 `_ + + `fesetround`:idx: + `posix.html#822 `_ + + `fetestexcept`:idx: + `posix.html#820 `_ + + `FE_TONEAREST`:idx: + `posix.html#339 `_ + + `FE_TOWARDZERO`:idx: + `posix.html#340 `_ + + `FE_UNDERFLOW`:idx: + `posix.html#336 `_ + + `feupdateenv`:idx: + `posix.html#826 `_ + + `FE_UPWARD`:idx: + `posix.html#341 `_ + + `F_GETFD`:idx: + `posix.html#300 `_ + + `F_GETFL`:idx: + `posix.html#302 `_ + + `F_GETLK`:idx: + `posix.html#304 `_ + + `F_GETOWN`:idx: + `posix.html#307 `_ + + `fileHandle`:idx: + `system.html#513 `_ + + `fileNewer`:idx: + `os.html#141 `_ + + `FileSystemCaseSensitive`:idx: + `os.html#106 `_ + + `finally`:idx: + `manual.html#188 `_ + + `find`:idx: + * `system.html#459 `_ + * `regexprs.html#109 `_ + * `regexprs.html#110 `_ + + `findChars`:idx: + `strutils.html#114 `_ + + `findSubStr`:idx: + * `strutils.html#112 `_ + * `strutils.html#113 `_ + + `float`:idx: + `system.html#106 `_ + + `float32`:idx: + `system.html#107 `_ + + `float64`:idx: + `system.html#108 `_ + + `F_LOCK`:idx: + `posix.html#496 `_ + + `FlushFile`:idx: + `system.html#491 `_ + + `fmtmsg`:idx: + `posix.html#827 `_ + + `fnmatch`:idx: + `posix.html#828 `_ + + `FNM_NOESCAPE`:idx: + `posix.html#365 `_ + + `FNM_NOMATCH`:idx: + `posix.html#362 `_ + + `FNM_NOSYS`:idx: + `posix.html#366 `_ + + `FNM_PATHNAME`:idx: + `posix.html#363 `_ + + `FNM_PERIOD`:idx: + `posix.html#364 `_ + + `F_OK`:idx: + `posix.html#478 `_ + + `for`:idx: + * `manual.html#203 `_ + * `tut1.html#105 `_ + + `fork`:idx: + `posix.html#986 `_ + + `form feed`:idx: + `manual.html#124 `_ + + `forward`:idx: + `manual.html#200 `_ + + `fpathconf`:idx: + `posix.html#987 `_ + + `F_RDLCK`:idx: + `posix.html#310 `_ + + `frexp`:idx: + `math.html#115 `_ + + `F_SETFD`:idx: + `posix.html#301 `_ + + `F_SETFL`:idx: + `posix.html#303 `_ + + `F_SETLK`:idx: + `posix.html#305 `_ + + `F_SETLKW`:idx: + `posix.html#306 `_ + + `F_SETOWN`:idx: + `posix.html#308 `_ + + `fstat`:idx: + `posix.html#1060 `_ + + `fstatvfs`:idx: + `posix.html#1057 `_ + + `fsync`:idx: + `posix.html#988 `_ + + `F_TEST`:idx: + `posix.html#497 `_ + + `F_TLOCK`:idx: + `posix.html#498 `_ + + `ftok`:idx: + `posix.html#1055 `_ + + `ftruncate`:idx: + `posix.html#989 `_ + + `ftw`:idx: + `posix.html#829 `_ + + `FTW_CHDIR`:idx: + `posix.html#377 `_ + + `FTW_D`:idx: + `posix.html#368 `_ + + `FTW_DEPTH`:idx: + `posix.html#376 `_ + + `FTW_DNR`:idx: + `posix.html#369 `_ + + `FTW_DP`:idx: + `posix.html#370 `_ + + `FTW_F`:idx: + `posix.html#367 `_ + + `FTW_MOUNT`:idx: + `posix.html#375 `_ + + `FTW_NS`:idx: + `posix.html#371 `_ + + `FTW_PHYS`:idx: + `posix.html#374 `_ + + `FTW_SL`:idx: + `posix.html#372 `_ + + `FTW_SLN`:idx: + `posix.html#373 `_ + + `F_ULOCK`:idx: + `posix.html#499 `_ + + `functional`:idx: + * `manual.html#162 `_ + * `tut1.html#124 `_ + + `F_UNLCK`:idx: + `posix.html#311 `_ + + `funtions`:idx: + `manual.html#198 `_ + + `F_WRLCK`:idx: + `posix.html#312 `_ + + `GC_disable`:idx: + `system.html#460 `_ + + `GC_disableMarkAndSweep`:idx: + `system.html#466 `_ + + `GC_enable`:idx: + `system.html#461 `_ + + `GC_enableMarkAndSweep`:idx: + `system.html#465 `_ + + `GC_fullCollect`:idx: + `system.html#462 `_ + + `GC_getStatistics`:idx: + `system.html#467 `_ + + `GC_ref`:idx: + * `system.html#468 `_ + * `system.html#469 `_ + * `system.html#470 `_ + + `GC_setStrategy`:idx: + `system.html#464 `_ + + `GC_unref`:idx: + * `system.html#471 `_ + * `system.html#472 `_ + * `system.html#473 `_ + + `generic character types`:idx: + `regexprs.html#102 `_ + + `Generics`:idx: + * `manual.html#207 `_ + * `tut2.html#109 `_ + + `getApplicationDir`:idx: + `os.html#110 `_ + + `getApplicationFilename`:idx: + `os.html#111 `_ + + `getClockStr`:idx: + `times.html#112 `_ + + `getColNumber`:idx: + `lexbase.html#107 `_ + + `getColumn`:idx: + `parsecfg.html#107 `_ + + `getConfigDir`:idx: + `os.html#115 `_ + + `getcontext`:idx: + `posix.html#1188 `_ + + `get_crc_table`:idx: + `zlib.html#186 `_ + + `getCurrentDir`:idx: + `os.html#112 `_ + + `getCurrentExceptionMsg`:idx: + `system.html#431 `_ + + `getCurrentLine`:idx: + `lexbase.html#106 `_ + + `getcwd`:idx: + `posix.html#990 `_ + + `getdate`:idx: + `posix.html#1103 `_ + + `getDateStr`:idx: + `times.html#111 `_ + + `getegid`:idx: + `posix.html#991 `_ + + `getEnv`:idx: + `os.html#143 `_ + + `geteuid`:idx: + `posix.html#992 `_ + + `getFilename`:idx: + `parsecfg.html#109 `_ + + `getFilePos`:idx: + `system.html#511 `_ + + `getFileSize`:idx: + `system.html#503 `_ + + `getFreeMem`:idx: + `system.html#437 `_ + + `getgid`:idx: + `posix.html#993 `_ + + `getGMTime`:idx: + `times.html#107 `_ + + `getgrent`:idx: + `posix.html#837 `_ + + `getgrgid`:idx: + `posix.html#833 `_ + + `getgrgid_r`:idx: + `posix.html#835 `_ + + `getgrnam`:idx: + `posix.html#834 `_ + + `getgrnam_r`:idx: + `posix.html#836 `_ + + `getgroups`:idx: + `posix.html#994 `_ + + `getHomeDir`:idx: + `os.html#114 `_ + + `gethostid`:idx: + `posix.html#995 `_ + + `gethostname`:idx: + `posix.html#996 `_ + + `getLastModificationTime`:idx: + `os.html#140 `_ + + `getLine`:idx: + `parsecfg.html#108 `_ + + `getLocalTime`:idx: + `times.html#106 `_ + + `getlogin`:idx: + `posix.html#997 `_ + + `getlogin_r`:idx: + `posix.html#998 `_ + + `getOccupiedMem`:idx: + `system.html#436 `_ + + `getopt`:idx: + * `posix.html#999 `_ + * `parseopt.html#106 `_ + + `getpgid`:idx: + `posix.html#1000 `_ + + `getpgrp`:idx: + `posix.html#1001 `_ + + `getpid`:idx: + `posix.html#1002 `_ + + `getppid`:idx: + `posix.html#1003 `_ + + `getpwent`:idx: + `posix.html#864 `_ + + `getpwnam`:idx: + `posix.html#859 `_ + + `getpwnam_r`:idx: + `posix.html#861 `_ + + `getpwuid`:idx: + `posix.html#860 `_ + + `getpwuid_r`:idx: + `posix.html#862 `_ + + `getRefcount`:idx: + `system.html#430 `_ + + `getRestOfCommandLine`:idx: + `parseopt.html#105 `_ + + `getsid`:idx: + `posix.html#1004 `_ + + `getStartMilsecs`:idx: + `times.html#116 `_ + + `getStream`:idx: + `zipfiles.html#109 `_ + + `getTime`:idx: + `times.html#105 `_ + + `getTotalMem`:idx: + `system.html#438 `_ + + `getuid`:idx: + `posix.html#1005 `_ + + `getwd`:idx: + `posix.html#1006 `_ + + `glob`:idx: + `posix.html#831 `_ + + `GLOB_ABORTED`:idx: + `posix.html#385 `_ + + `GLOB_APPEND`:idx: + `posix.html#378 `_ + + `GLOB_DOOFFS`:idx: + `posix.html#379 `_ + + `GLOB_ERR`:idx: + `posix.html#380 `_ + + `globfree`:idx: + `posix.html#832 `_ + + `GLOB_MARK`:idx: + `posix.html#381 `_ + + `GLOB_NOCHECK`:idx: + `posix.html#382 `_ + + `GLOB_NOESCAPE`:idx: + `posix.html#383 `_ + + `GLOB_NOMATCH`:idx: + `posix.html#386 `_ + + `GLOB_NOSORT`:idx: + `posix.html#384 `_ + + `GLOB_NOSPACE`:idx: + `posix.html#387 `_ + + `GLOB_NOSYS`:idx: + `posix.html#388 `_ + + `gmtime`:idx: + `posix.html#1104 `_ + + `gmtime_r`:idx: + `posix.html#1105 `_ + + `gzclose`:idx: + `zlib.html#172 `_ + + `gzdopen`:idx: + `zlib.html#158 `_ + + `gzeof`:idx: + `zlib.html#171 `_ + + `gzerror`:idx: + `zlib.html#173 `_ + + `gzFile`:idx: + `zlib.html#115 `_ + + `gzflush`:idx: + `zlib.html#167 `_ + + `gzgetc`:idx: + `zlib.html#166 `_ + + `gzgets`:idx: + `zlib.html#164 `_ + + `gzopen`:idx: + `zlib.html#157 `_ + + `gzprintf`:idx: + `zlib.html#162 `_ + + `gzputc`:idx: + `zlib.html#165 `_ + + `gzputs`:idx: + `zlib.html#163 `_ + + `gzread`:idx: + `zlib.html#160 `_ + + `gzrewind`:idx: + `zlib.html#169 `_ + + `gzseek`:idx: + `zlib.html#168 `_ + + `gzsetparams`:idx: + `zlib.html#159 `_ + + `gztell`:idx: + `zlib.html#170 `_ + + `gzwrite`:idx: + `zlib.html#161 `_ + + `HandleCR`:idx: + `lexbase.html#108 `_ + + `HandleLF`:idx: + `lexbase.html#109 `_ + + `hash`:idx: + * `hashes.html#103 `_ + * `hashes.html#104 `_ + * `hashes.html#105 `_ + * `hashes.html#106 `_ + * `hashes.html#107 `_ + + `hashData`:idx: + `hashes.html#102 `_ + + `hashIgnoreCase`:idx: + `hashes.html#109 `_ + + `hashIgnoreStyle`:idx: + `hashes.html#108 `_ + + `hasKey`:idx: + `strtabs.html#108 `_ + + `header`:idx: + `nimrodc.html#105 `_ + + `high`:idx: + `system.html#121 `_ + + `hint`:idx: + * `manual.html#219 `_ + * `manual.html#227 `_ + + `hostCPU`:idx: + `system.html#399 `_ + + `hostOS`:idx: + `system.html#398 `_ + + `htonl`:idx: + `posix.html#792 `_ + + `htons`:idx: + `posix.html#793 `_ + + `hypot`:idx: + `math.html#123 `_ + + `iconv`:idx: + `posix.html#841 `_ + + `iconv_close`:idx: + `posix.html#842 `_ + + `iconv_open`:idx: + `posix.html#840 `_ + + `identifier`:idx: + `manual.html#105 `_ + + `Identifiers`:idx: + `manual.html#116 `_ + + `if`:idx: + `manual.html#180 `_ + + `implicit block`:idx: + `manual.html#205 `_ + + `import`:idx: + * `manual.html#215 `_ + * `tut1.html#128 `_ + + `importc`:idx: + `nimrodc.html#101 `_ + + `in`:idx: + `system.html#355 `_ + + `inc`:idx: + `system.html#159 `_ + + `incl`:idx: + `system.html#167 `_ + + `include`:idx: + `tut1.html#129 `_ + + `indentation sensitive`:idx: + `manual.html#113 `_ + + `inet_addr`:idx: + `posix.html#796 `_ + + `inet_ntoa`:idx: + `posix.html#797 `_ + + `inet_ntop`:idx: + `posix.html#798 `_ + + `inet_pton`:idx: + `posix.html#799 `_ + + `inf`:idx: + `system.html#432 `_ + + `inflate`:idx: + `zlib.html#145 `_ + + `inflateEnd`:idx: + `zlib.html#146 `_ + + `inflateInit`:idx: + `zlib.html#179 `_ + + `inflateInit2`:idx: + `zlib.html#183 `_ + + `inflateInit2u`:idx: + `zlib.html#181 `_ + + `inflateInitu`:idx: + `zlib.html#177 `_ + + `inflateReset`:idx: + `zlib.html#153 `_ + + `inflateSetDictionary`:idx: + `zlib.html#151 `_ + + `inflateSync`:idx: + `zlib.html#152 `_ + + `inflateSyncPoint`:idx: + `zlib.html#185 `_ + + `info`:idx: + `dialogs.html#102 `_ + + `information hiding`:idx: + * `manual.html#213 `_ + * `tut1.html#126 `_ + + `init`:idx: + `parseopt.html#103 `_ + + `inline`:idx: + `manual.html#167 `_ + + `int`:idx: + `system.html#101 `_ + + `int16`:idx: + `system.html#103 `_ + + `int32`:idx: + `system.html#104 `_ + + `int64`:idx: + `system.html#105 `_ + + `int8`:idx: + `system.html#102 `_ + + `intToStr`:idx: + `strutils.html#129 `_ + + `IPC_CREAT`:idx: + `posix.html#642 `_ + + `IPC_EXCL`:idx: + `posix.html#643 `_ + + `IPC_NOWAIT`:idx: + `posix.html#644 `_ + + `IPC_PRIVATE`:idx: + `posix.html#645 `_ + + `IPC_RMID`:idx: + `posix.html#646 `_ + + `IPC_SET`:idx: + `posix.html#647 `_ + + `IPC_STAT`:idx: + `posix.html#648 `_ + + `is`:idx: + `system.html#357 `_ + + `isatty`:idx: + `posix.html#1007 `_ + + `isMainModule`:idx: + `system.html#390 `_ + + `isNil`:idx: + * `system.html#447 `_ + * `system.html#448 `_ + * `system.html#449 `_ + * `system.html#450 `_ + * `system.html#451 `_ + * `system.html#452 `_ + + `is_not`:idx: + `system.html#358 `_ + + `isPowerOfTwo`:idx: + `math.html#105 `_ + + `items`:idx: + * `system.html#441 `_ + * `system.html#442 `_ + * `system.html#443 `_ + * `system.html#444 `_ + * `system.html#445 `_ + * `system.html#446 `_ + + `iterator`:idx: + `manual.html#204 `_ + + `iterOverEnvironment`:idx: + `os.html#150 `_ + + `JavaScript`:idx: + `nimrodc.html#116 `_ + + `JoinPath`:idx: + * `os.html#118 `_ + * `os.html#120 `_ + + `keywords`:idx: + `manual.html#117 `_ + + `kill`:idx: + `posix.html#1123 `_ + + `killpg`:idx: + `posix.html#1124 `_ + + `l-values`:idx: + `manual.html#107 `_ + + `lambda`:idx: + `tut2.html#106 `_ + + `LC_ALL`:idx: + `posix.html#444 `_ + + `LC_COLLATE`:idx: + `posix.html#445 `_ + + `LC_CTYPE`:idx: + `posix.html#446 `_ + + `lchown`:idx: + `posix.html#1008 `_ + + `LC_MESSAGES`:idx: + `posix.html#447 `_ + + `LC_MONETARY`:idx: + `posix.html#448 `_ + + `LC_NUMERIC`:idx: + `posix.html#449 `_ + + `LC_TIME`:idx: + `posix.html#450 `_ + + `len`:idx: + * `system.html#162 `_ + * `system.html#163 `_ + * `system.html#164 `_ + * `system.html#165 `_ + * `system.html#166 `_ + * `strtabs.html#109 `_ + + `line feed`:idx: + `manual.html#123 `_ + + `line_dir`:idx: + `nimrodc.html#107 `_ + + `lines`:idx: + `system.html#512 `_ + + `line_trace`:idx: + `nimrodc.html#109 `_ + + `link`:idx: + `posix.html#1009 `_ + + `lio_listio`:idx: + `posix.html#791 `_ + + `LIO_NOP`:idx: + `posix.html#210 `_ + + `LIO_NOWAIT`:idx: + `posix.html#211 `_ + + `LIO_READ`:idx: + `posix.html#212 `_ + + `LIO_WAIT`:idx: + `posix.html#213 `_ + + `LIO_WRITE`:idx: + `posix.html#214 `_ + + `Literal strings`:idx: + `manual.html#119 `_ + + `ln`:idx: + `math.html#111 `_ + + `local type inference`:idx: + `tut1.html#101 `_ + + `localeconv`:idx: + `posix.html#846 `_ + + `localtime`:idx: + `posix.html#1106 `_ + + `localtime_r`:idx: + `posix.html#1107 `_ + + `locations`:idx: + `manual.html#101 `_ + + `lockf`:idx: + `posix.html#1010 `_ + + `log10`:idx: + `math.html#112 `_ + + `log2`:idx: + `math.html#113 `_ + + `low`:idx: + `system.html#122 `_ + + `lseek`:idx: + `posix.html#1011 `_ + + `lstat`:idx: + `posix.html#1061 `_ + + `Macros`:idx: + * `manual.html#210 `_ + * `tut2.html#111 `_ + + `makecontext`:idx: + `posix.html#1189 `_ + + `MAP_FAILED`:idx: + `posix.html#686 `_ + + `MAP_FIXED`:idx: + `posix.html#680 `_ + + `MAP_PRIVATE`:idx: + `posix.html#679 `_ + + `MAP_SHARED`:idx: + `posix.html#678 `_ + + `match`:idx: + * `regexprs.html#106 `_ + * `regexprs.html#107 `_ + + `matchLen`:idx: + `regexprs.html#108 `_ + + `math`:idx: + `nimrodc.html#118 `_ + + `max`:idx: + * `system.html#271 `_ + * `system.html#272 `_ + * `system.html#273 `_ + * `system.html#274 `_ + * `system.html#275 `_ + * `system.html#322 `_ + + `MaxSubpatterns`:idx: + `regexprs.html#105 `_ + + `MCL_CURRENT`:idx: + `posix.html#684 `_ + + `MCL_FUTURE`:idx: + `posix.html#685 `_ + + `method call syntax`:idx: + `tut2.html#104 `_ + + `methods`:idx: + `manual.html#197 `_ + + `min`:idx: + * `system.html#266 `_ + * `system.html#267 `_ + * `system.html#268 `_ + * `system.html#269 `_ + * `system.html#270 `_ + * `system.html#321 `_ + + `MINSIGSTKSZ`:idx: + `posix.html#766 `_ + + `mkdir`:idx: + `posix.html#1062 `_ + + `mkfifo`:idx: + `posix.html#1063 `_ + + `mknod`:idx: + `posix.html#1064 `_ + + `mktime`:idx: + `posix.html#1108 `_ + + `mlock`:idx: + `posix.html#1078 `_ + + `mlockall`:idx: + `posix.html#1079 `_ + + `mmap`:idx: + `posix.html#1080 `_ + + `MM_APPL`:idx: + `posix.html#346 `_ + + `MM_CONSOLE`:idx: + `posix.html#357 `_ + + `MM_ERROR`:idx: + `posix.html#352 `_ + + `MM_FIRM`:idx: + `posix.html#345 `_ + + `MM_HALT`:idx: + `posix.html#351 `_ + + `MM_HARD`:idx: + `posix.html#343 `_ + + `MM_INFO`:idx: + `posix.html#354 `_ + + `MM_NOCON`:idx: + `posix.html#361 `_ + + `MM_NOMSG`:idx: + `posix.html#360 `_ + + `MM_NOSEV`:idx: + `posix.html#355 `_ + + `MM_NOTOK`:idx: + `posix.html#359 `_ + + `MM_NRECOV`:idx: + `posix.html#350 `_ + + `MM_NULLACT`:idx: + `posix.html#125 `_ + + `MM_NULLLBL`:idx: + `posix.html#121 `_ + + `MM_NULLMC`:idx: + `posix.html#123 `_ + + `MM_NULLSEV`:idx: + `posix.html#122 `_ + + `MM_NULLTAG`:idx: + `posix.html#126 `_ + + `MM_NULLTXT`:idx: + `posix.html#124 `_ + + `MM_OK`:idx: + `posix.html#358 `_ + + `MM_OPSYS`:idx: + `posix.html#348 `_ + + `MM_PRINT`:idx: + `posix.html#356 `_ + + `MM_RECOVER`:idx: + `posix.html#349 `_ + + `MM_SOFT`:idx: + `posix.html#344 `_ + + `MM_UTIL`:idx: + `posix.html#347 `_ + + `MM_WARNING`:idx: + `posix.html#353 `_ + + `mod`:idx: + * `system.html#216 `_ + * `system.html#217 `_ + * `system.html#218 `_ + * `system.html#219 `_ + * `system.html#220 `_ + + `module`:idx: + * `manual.html#212 `_ + * `tut1.html#125 `_ + + `MON_1`:idx: + `posix.html#410 `_ + + `MON_10`:idx: + `posix.html#419 `_ + + `MON_11`:idx: + `posix.html#420 `_ + + `MON_12`:idx: + `posix.html#421 `_ + + `MON_2`:idx: + `posix.html#411 `_ + + `MON_3`:idx: + `posix.html#412 `_ + + `MON_4`:idx: + `posix.html#413 `_ + + `MON_5`:idx: + `posix.html#414 `_ + + `MON_6`:idx: + `posix.html#415 `_ + + `MON_7`:idx: + `posix.html#416 `_ + + `MON_8`:idx: + `posix.html#417 `_ + + `MON_9`:idx: + `posix.html#418 `_ + + `moveFile`:idx: + `os.html#135 `_ + + `moveMem`:idx: + `system.html#411 `_ + + `mprotect`:idx: + `posix.html#1081 `_ + + `mq_close`:idx: + `posix.html#849 `_ + + `mq_getattr`:idx: + `posix.html#850 `_ + + `mq_notify`:idx: + `posix.html#851 `_ + + `mq_open`:idx: + `posix.html#852 `_ + + `mq_receive`:idx: + `posix.html#853 `_ + + `mq_send`:idx: + `posix.html#854 `_ + + `mq_setattr`:idx: + `posix.html#855 `_ + + `mq_timedreceive`:idx: + `posix.html#856 `_ + + `mq_timedsend`:idx: + `posix.html#857 `_ + + `mq_unlink`:idx: + `posix.html#858 `_ + + `MS_ASYNC`:idx: + `posix.html#681 `_ + + `MS_INVALIDATE`:idx: + `posix.html#683 `_ + + `MS_SYNC`:idx: + `posix.html#682 `_ + + `msync`:idx: + `posix.html#1082 `_ + + `munlock`:idx: + `posix.html#1083 `_ + + `munlockall`:idx: + `posix.html#1084 `_ + + `munmap`:idx: + `posix.html#1085 `_ + + `nan`:idx: + `system.html#434 `_ + + `nanosleep`:idx: + `posix.html#1109 `_ + + `Natural`:idx: + `system.html#129 `_ + + `neginf`:idx: + `system.html#433 `_ + + `new`:idx: + * `system.html#119 `_ + * `system.html#120 `_ + + `newFileStream`:idx: + * `streams.html#120 `_ + * `streams.html#121 `_ + + `newline`:idx: + `manual.html#121 `_ + + `NewLines`:idx: + `lexbase.html#102 `_ + + `newSeq`:idx: + `system.html#161 `_ + + `newString`:idx: + `system.html#408 `_ + + `newStringStream`:idx: + `streams.html#117 `_ + + `newStringTable`:idx: + * `strtabs.html#104 `_ + * `strtabs.html#105 `_ + + `next`:idx: + * `parseopt.html#104 `_ + * `parsecfg.html#106 `_ + + `nextPowerOfTwo`:idx: + `math.html#106 `_ + + `nftw`:idx: + `posix.html#830 `_ + + `nice`:idx: + `posix.html#1012 `_ + + `nimcall`:idx: + `manual.html#169 `_ + + `NimrodMajor`:idx: + `system.html#394 `_ + + `NimrodMinor`:idx: + `system.html#395 `_ + + `NimrodPatch`:idx: + `system.html#396 `_ + + `NimrodVersion`:idx: + `system.html#393 `_ + + `nl`:idx: + `strutils.html#104 `_ + + `NL_CAT_LOCALE`:idx: + `posix.html#769 `_ + + `nl_langinfo`:idx: + `posix.html#843 `_ + + `NL_SETD`:idx: + `posix.html#768 `_ + + `noconv`:idx: + `manual.html#172 `_ + + `no_decl`:idx: + `nimrodc.html#104 `_ + + `NOEXPR`:idx: + `posix.html#442 `_ + + `normalize`:idx: + `strutils.html#111 `_ + + `not`:idx: + * `system.html#115 `_ + * `system.html#191 `_ + * `system.html#192 `_ + * `system.html#193 `_ + * `system.html#194 `_ + * `system.html#195 `_ + + `not_in`:idx: + `system.html#356 `_ + + `ntohl`:idx: + `posix.html#794 `_ + + `ntohs`:idx: + `posix.html#795 `_ + + `Numerical constants`:idx: + `manual.html#136 `_ + + `O_ACCMODE`:idx: + `posix.html#322 `_ + + `O_APPEND`:idx: + `posix.html#317 `_ + + `object`:idx: + `manual.html#155 `_ + + `O_CREAT`:idx: + `posix.html#313 `_ + + `ODBC_ADD_DSN`:idx: + `odbcsql.html#621 `_ + + `ODBC_ADD_SYS_DSN`:idx: + `odbcsql.html#624 `_ + + `ODBC_CONFIG_DSN`:idx: + `odbcsql.html#622 `_ + + `ODBC_CONFIG_SYS_DSN`:idx: + `odbcsql.html#625 `_ + + `ODBC_REMOVE_DSN`:idx: + `odbcsql.html#623 `_ + + `ODBC_REMOVE_SYS_DSN`:idx: + `odbcsql.html#626 `_ + + `O_DSYNC`:idx: + `posix.html#318 `_ + + `O_EXCL`:idx: + `posix.html#314 `_ + + `O_NOCTTY`:idx: + `posix.html#315 `_ + + `O_NONBLOCK`:idx: + `posix.html#319 `_ + + `open`:idx: + * `posix.html#813 `_ + * `lexbase.html#104 `_ + * `parsecfg.html#104 `_ + * `zipfiles.html#102 `_ + + `openarray`:idx: + * `tut1.html#118 `_ + * `system.html#125 `_ + + `opendir`:idx: + `posix.html#801 `_ + + `OpenFile`:idx: + * `system.html#486 `_ + * `system.html#487 `_ + + `operator`:idx: + `manual.html#138 `_ + + `Operators`:idx: + `manual.html#202 `_ + + `or`:idx: + * `system.html#117 `_ + * `system.html#236 `_ + * `system.html#237 `_ + * `system.html#238 `_ + * `system.html#239 `_ + * `system.html#240 `_ + + `ord`:idx: + `system.html#170 `_ + + `ordinal`:idx: + `tut1.html#114 `_ + + `Ordinal types`:idx: + `manual.html#141 `_ + + `O_RDONLY`:idx: + `posix.html#323 `_ + + `O_RDWR`:idx: + `posix.html#324 `_ + + `O_RSYNC`:idx: + `posix.html#320 `_ + + `OSError`:idx: + `os.html#147 `_ + + `O_SYNC`:idx: + `posix.html#321 `_ + + `O_TRUNC`:idx: + `posix.html#316 `_ + + `O_WRONLY`:idx: + `posix.html#325 `_ + + `pairs`:idx: + `strtabs.html#110 `_ + + `P_ALL`:idx: + `posix.html#716 `_ + + `paramCount`:idx: + `os.html#145 `_ + + `paramStr`:idx: + `os.html#146 `_ + + `ParDir`:idx: + `os.html#102 `_ + + `parentDir`:idx: + `os.html#122 `_ + + `ParseBiggestInt`:idx: + `strutils.html#131 `_ + + `parseCmdLine`:idx: + `os.html#154 `_ + + `ParseFloat`:idx: + `strutils.html#132 `_ + + `ParseInt`:idx: + `strutils.html#130 `_ + + `pathconf`:idx: + `posix.html#1013 `_ + + `PathSep`:idx: + `os.html#105 `_ + + `pause`:idx: + `posix.html#1014 `_ + + `pbyte`:idx: + `zlib.html#106 `_ + + `pbytef`:idx: + `zlib.html#107 `_ + + `PC_2_SYMLINKS`:idx: + `posix.html#500 `_ + + `PC_ALLOC_SIZE_MIN`:idx: + `posix.html#501 `_ + + `PC_ASYNC_IO`:idx: + `posix.html#502 `_ + + `PC_CHOWN_RESTRICTED`:idx: + `posix.html#503 `_ + + `PC_FILESIZEBITS`:idx: + `posix.html#504 `_ + + `PC_LINK_MAX`:idx: + `posix.html#505 `_ + + `PC_MAX_CANON`:idx: + `posix.html#506 `_ + + `PC_MAX_INPUT`:idx: + `posix.html#507 `_ + + `PC_NAME_MAX`:idx: + `posix.html#508 `_ + + `PC_NO_TRUNC`:idx: + `posix.html#509 `_ + + `PC_PATH_MAX`:idx: + `posix.html#510 `_ + + `PC_PIPE_BUF`:idx: + `posix.html#511 `_ + + `PC_PRIO_IO`:idx: + `posix.html#512 `_ + + `PC_REC_INCR_XFER_SIZE`:idx: + `posix.html#513 `_ + + `PC_REC_MIN_XFER_SIZE`:idx: + `posix.html#514 `_ + + `PC_REC_XFER_ALIGN`:idx: + `posix.html#515 `_ + + `PC_SYMLINK_MAX`:idx: + `posix.html#516 `_ + + `PC_SYNC_IO`:idx: + `posix.html#517 `_ + + `PC_VDISABLE`:idx: + `posix.html#518 `_ + + `PFileStream`:idx: + `streams.html#118 `_ + + `PFloat32`:idx: + `system.html#386 `_ + + `PFloat64`:idx: + `system.html#387 `_ + + `PI`:idx: + `math.html#101 `_ + + `PInt32`:idx: + `system.html#389 `_ + + `PInt64`:idx: + `system.html#388 `_ + + `PInternalState`:idx: + `zlib.html#111 `_ + + `pipe`:idx: + `posix.html#1015 `_ + + `PM_STR`:idx: + `posix.html#395 `_ + + `PObject`:idx: + `system.html#132 `_ + + `pointer`:idx: + `system.html#113 `_ + + `pointers`:idx: + * `manual.html#158 `_ + * `tut1.html#120 `_ + + `Positive`:idx: + `system.html#130 `_ + + `POSIX_ASYNC_IO`:idx: + `posix.html#475 `_ + + `POSIX_FADV_DONTNEED`:idx: + `posix.html#330 `_ + + `posix_fadvise`:idx: + `posix.html#814 `_ + + `POSIX_FADV_NOREUSE`:idx: + `posix.html#331 `_ + + `POSIX_FADV_NORMAL`:idx: + `posix.html#326 `_ + + `POSIX_FADV_RANDOM`:idx: + `posix.html#328 `_ + + `POSIX_FADV_SEQUENTIAL`:idx: + `posix.html#327 `_ + + `POSIX_FADV_WILLNEED`:idx: + `posix.html#329 `_ + + `posix_fallocate`:idx: + `posix.html#815 `_ + + `POSIX_MADV_DONTNEED`:idx: + `posix.html#691 `_ + + `posix_madvise`:idx: + `posix.html#1086 `_ + + `POSIX_MADV_NORMAL`:idx: + `posix.html#687 `_ + + `POSIX_MADV_RANDOM`:idx: + `posix.html#689 `_ + + `POSIX_MADV_SEQUENTIAL`:idx: + `posix.html#688 `_ + + `POSIX_MADV_WILLNEED`:idx: + `posix.html#690 `_ + + `posix_mem_offset`:idx: + `posix.html#1087 `_ + + `POSIX_PRIO_IO`:idx: + `posix.html#476 `_ + + `posix_spawn`:idx: + `posix.html#1167 `_ + + `posix_spawnattr_destroy`:idx: + `posix.html#1173 `_ + + `posix_spawnattr_getflags`:idx: + `posix.html#1175 `_ + + `posix_spawnattr_getpgroup`:idx: + `posix.html#1176 `_ + + `posix_spawnattr_getschedparam`:idx: + `posix.html#1177 `_ + + `posix_spawnattr_getschedpolicy`:idx: + `posix.html#1178 `_ + + `posix_spawnattr_getsigdefault`:idx: + `posix.html#1174 `_ + + `posix_spawnattr_getsigmask`:idx: + `posix.html#1179 `_ + + `posix_spawnattr_init`:idx: + `posix.html#1180 `_ + + `posix_spawnattr_setflags`:idx: + `posix.html#1182 `_ + + `posix_spawnattr_setpgroup`:idx: + `posix.html#1183 `_ + + `posix_spawnattr_setschedparam`:idx: + `posix.html#1184 `_ + + `posix_spawnattr_setschedpolicy`:idx: + `posix.html#1185 `_ + + `posix_spawnattr_setsigdefault`:idx: + `posix.html#1181 `_ + + `posix_spawnattr_setsigmask`:idx: + `posix.html#1186 `_ + + `posix_spawn_file_actions_addclose`:idx: + `posix.html#1168 `_ + + `posix_spawn_file_actions_adddup2`:idx: + `posix.html#1169 `_ + + `posix_spawn_file_actions_addopen`:idx: + `posix.html#1170 `_ + + `posix_spawn_file_actions_destroy`:idx: + `posix.html#1171 `_ + + `posix_spawn_file_actions_init`:idx: + `posix.html#1172 `_ + + `posix_spawnp`:idx: + `posix.html#1187 `_ + + `POSIX_SPAWN_RESETIDS`:idx: + `posix.html#778 `_ + + `POSIX_SPAWN_SETPGROUP`:idx: + `posix.html#779 `_ + + `POSIX_SPAWN_SETSCHEDPARAM`:idx: + `posix.html#780 `_ + + `POSIX_SPAWN_SETSCHEDULER`:idx: + `posix.html#781 `_ + + `POSIX_SPAWN_SETSIGDEF`:idx: + `posix.html#782 `_ + + `POSIX_SPAWN_SETSIGMASK`:idx: + `posix.html#783 `_ + + `POSIX_SYNC_IO`:idx: + `posix.html#477 `_ + + `POSIX_TYPED_MEM_ALLOCATE`:idx: + `posix.html#692 `_ + + `POSIX_TYPED_MEM_ALLOCATE_CONTIG`:idx: + `posix.html#693 `_ + + `posix_typed_mem_get_info`:idx: + `posix.html#1088 `_ + + `POSIX_TYPED_MEM_MAP_ALLOCATABLE`:idx: + `posix.html#694 `_ + + `posix_typed_mem_open`:idx: + `posix.html#1089 `_ + + `pow`:idx: + `math.html#127 `_ + + `P_PGID`:idx: + `posix.html#718 `_ + + `P_PID`:idx: + `posix.html#717 `_ + + `pread`:idx: + `posix.html#1016 `_ + + `pred`:idx: + `system.html#158 `_ + + `procedural type`:idx: + * `manual.html#161 `_ + * `tut1.html#123 `_ + + `procedures`:idx: + `manual.html#199 `_ + + `PROT_EXEC`:idx: + `posix.html#676 `_ + + `PROT_NONE`:idx: + `posix.html#677 `_ + + `PROT_READ`:idx: + `posix.html#674 `_ + + `PROT_WRITE`:idx: + `posix.html#675 `_ + + `pselect`:idx: + `posix.html#1165 `_ + + `PSQLCHAR`:idx: + `odbcsql.html#116 `_ + + `PSQL_DATE_STRUCT`:idx: + `odbcsql.html#232 `_ + + `PSQLDOUBLE`:idx: + `odbcsql.html#122 `_ + + `PSQLFLOAT`:idx: + `odbcsql.html#123 `_ + + `PSQLHANDLE`:idx: + `odbcsql.html#124 `_ + + `PSQLINTEGER`:idx: + `odbcsql.html#117 `_ + + `PSQLREAL`:idx: + `odbcsql.html#121 `_ + + `PSQLSMALLINT`:idx: + `odbcsql.html#119 `_ + + `PSQL_TIMESTAMP_STRUCT`:idx: + `odbcsql.html#236 `_ + + `PSQL_TIME_STRUCT`:idx: + `odbcsql.html#234 `_ + + `PSQLUINTEGER`:idx: + `odbcsql.html#118 `_ + + `PSQLUSMALLINT`:idx: + `odbcsql.html#120 `_ + + `PStream`:idx: + `streams.html#101 `_ + + `PStringStream`:idx: + `streams.html#115 `_ + + `PStringTable`:idx: + `strtabs.html#103 `_ + + `pthread_atfork`:idx: + `posix.html#867 `_ + + `pthread_attr_destroy`:idx: + `posix.html#868 `_ + + `pthread_attr_getdetachstate`:idx: + `posix.html#869 `_ + + `pthread_attr_getguardsize`:idx: + `posix.html#870 `_ + + `pthread_attr_getinheritsched`:idx: + `posix.html#871 `_ + + `pthread_attr_getschedparam`:idx: + `posix.html#872 `_ + + `pthread_attr_getschedpolicy`:idx: + `posix.html#873 `_ + + `pthread_attr_getscope`:idx: + `posix.html#874 `_ + + `pthread_attr_getstack`:idx: + `posix.html#875 `_ + + `pthread_attr_getstackaddr`:idx: + `posix.html#876 `_ + + `pthread_attr_getstacksize`:idx: + `posix.html#877 `_ + + `pthread_attr_init`:idx: + `posix.html#878 `_ + + `pthread_attr_setdetachstate`:idx: + `posix.html#879 `_ + + `pthread_attr_setguardsize`:idx: + `posix.html#880 `_ + + `pthread_attr_setinheritsched`:idx: + `posix.html#881 `_ + + `pthread_attr_setschedparam`:idx: + `posix.html#882 `_ + + `pthread_attr_setschedpolicy`:idx: + `posix.html#883 `_ + + `pthread_attr_setscope`:idx: + `posix.html#884 `_ + + `pthread_attr_setstack`:idx: + `posix.html#885 `_ + + `pthread_attr_setstackaddr`:idx: + `posix.html#886 `_ + + `pthread_attr_setstacksize`:idx: + `posix.html#887 `_ + + `pthread_barrierattr_destroy`:idx: + `posix.html#891 `_ + + `pthread_barrierattr_getpshared`:idx: + `posix.html#892 `_ + + `pthread_barrierattr_init`:idx: + `posix.html#893 `_ + + `pthread_barrierattr_setpshared`:idx: + `posix.html#894 `_ + + `pthread_barrier_destroy`:idx: + `posix.html#888 `_ + + `pthread_barrier_init`:idx: + `posix.html#889 `_ + + `PTHREAD_BARRIER_SERIAL_THREAD`:idx: + `posix.html#451 `_ + + `pthread_barrier_wait`:idx: + `posix.html#890 `_ + + `pthread_cancel`:idx: + `posix.html#895 `_ + + `PTHREAD_CANCEL_ASYNCHRONOUS`:idx: + `posix.html#452 `_ + + `PTHREAD_CANCEL_DEFERRED`:idx: + `posix.html#454 `_ + + `PTHREAD_CANCEL_DISABLE`:idx: + `posix.html#455 `_ + + `PTHREAD_CANCELED`:idx: + `posix.html#456 `_ + + `PTHREAD_CANCEL_ENABLE`:idx: + `posix.html#453 `_ + + `pthread_cleanup_pop`:idx: + `posix.html#897 `_ + + `pthread_cleanup_push`:idx: + `posix.html#896 `_ + + `pthread_condattr_destroy`:idx: + `posix.html#904 `_ + + `pthread_condattr_getclock`:idx: + `posix.html#905 `_ + + `pthread_condattr_getpshared`:idx: + `posix.html#906 `_ + + `pthread_condattr_init`:idx: + `posix.html#907 `_ + + `pthread_condattr_setclock`:idx: + `posix.html#908 `_ + + `pthread_condattr_setpshared`:idx: + `posix.html#909 `_ + + `pthread_cond_broadcast`:idx: + `posix.html#898 `_ + + `pthread_cond_destroy`:idx: + `posix.html#899 `_ + + `pthread_cond_init`:idx: + `posix.html#900 `_ + + `PTHREAD_COND_INITIALIZER`:idx: + `posix.html#457 `_ + + `pthread_cond_signal`:idx: + `posix.html#901 `_ + + `pthread_cond_timedwait`:idx: + `posix.html#902 `_ + + `pthread_cond_wait`:idx: + `posix.html#903 `_ + + `pthread_create`:idx: + `posix.html#910 `_ + + `PTHREAD_CREATE_DETACHED`:idx: + `posix.html#458 `_ + + `PTHREAD_CREATE_JOINABLE`:idx: + `posix.html#459 `_ + + `pthread_detach`:idx: + `posix.html#911 `_ + + `pthread_equal`:idx: + `posix.html#912 `_ + + `pthread_exit`:idx: + `posix.html#913 `_ + + `PTHREAD_EXPLICIT_SCHED`:idx: + `posix.html#460 `_ + + `pthread_getconcurrency`:idx: + `posix.html#914 `_ + + `pthread_getcpuclockid`:idx: + `posix.html#915 `_ + + `pthread_getschedparam`:idx: + `posix.html#916 `_ + + `pthread_getspecific`:idx: + `posix.html#917 `_ + + `PTHREAD_INHERIT_SCHED`:idx: + `posix.html#461 `_ + + `pthread_join`:idx: + `posix.html#918 `_ + + `pthread_key_create`:idx: + `posix.html#919 `_ + + `pthread_key_delete`:idx: + `posix.html#920 `_ + + `pthread_kill`:idx: + `posix.html#1125 `_ + + `pthread_mutexattr_destroy`:idx: + `posix.html#929 `_ + + `pthread_mutexattr_getprioceiling`:idx: + `posix.html#930 `_ + + `pthread_mutexattr_getprotocol`:idx: + `posix.html#931 `_ + + `pthread_mutexattr_getpshared`:idx: + `posix.html#932 `_ + + `pthread_mutexattr_gettype`:idx: + `posix.html#933 `_ + + `pthread_mutexattr_init`:idx: + `posix.html#934 `_ + + `pthread_mutexattr_setprioceiling`:idx: + `posix.html#935 `_ + + `pthread_mutexattr_setprotocol`:idx: + `posix.html#936 `_ + + `pthread_mutexattr_setpshared`:idx: + `posix.html#937 `_ + + `pthread_mutexattr_settype`:idx: + `posix.html#938 `_ + + `PTHREAD_MUTEX_DEFAULT`:idx: + `posix.html#462 `_ + + `pthread_mutex_destroy`:idx: + `posix.html#921 `_ + + `PTHREAD_MUTEX_ERRORCHECK`:idx: + `posix.html#463 `_ + + `pthread_mutex_getprioceiling`:idx: + `posix.html#922 `_ + + `pthread_mutex_init`:idx: + `posix.html#923 `_ + + `PTHREAD_MUTEX_INITIALIZER`:idx: + `posix.html#464 `_ + + `pthread_mutex_lock`:idx: + `posix.html#924 `_ + + `PTHREAD_MUTEX_NORMAL`:idx: + `posix.html#465 `_ + + `PTHREAD_MUTEX_RECURSIVE`:idx: + `posix.html#466 `_ + + `pthread_mutex_setprioceiling`:idx: + `posix.html#925 `_ + + `pthread_mutex_timedlock`:idx: + `posix.html#926 `_ + + `pthread_mutex_trylock`:idx: + `posix.html#927 `_ + + `pthread_mutex_unlock`:idx: + `posix.html#928 `_ + + `pthread_once`:idx: + `posix.html#939 `_ + + `PTHREAD_ONCE_INIT`:idx: + `posix.html#467 `_ + + `PTHREAD_PRIO_INHERIT`:idx: + `posix.html#468 `_ + + `PTHREAD_PRIO_NONE`:idx: + `posix.html#469 `_ + + `PTHREAD_PRIO_PROTECT`:idx: + `posix.html#470 `_ + + `PTHREAD_PROCESS_PRIVATE`:idx: + `posix.html#472 `_ + + `PTHREAD_PROCESS_SHARED`:idx: + `posix.html#471 `_ + + `pthread_rwlockattr_destroy`:idx: + `posix.html#949 `_ + + `pthread_rwlockattr_getpshared`:idx: + `posix.html#950 `_ + + `pthread_rwlockattr_init`:idx: + `posix.html#951 `_ + + `pthread_rwlockattr_setpshared`:idx: + `posix.html#952 `_ + + `pthread_rwlock_destroy`:idx: + `posix.html#940 `_ + + `pthread_rwlock_init`:idx: + `posix.html#941 `_ + + `pthread_rwlock_rdlock`:idx: + `posix.html#942 `_ + + `pthread_rwlock_timedrdlock`:idx: + `posix.html#943 `_ + + `pthread_rwlock_timedwrlock`:idx: + `posix.html#944 `_ + + `pthread_rwlock_tryrdlock`:idx: + `posix.html#945 `_ + + `pthread_rwlock_trywrlock`:idx: + `posix.html#946 `_ + + `pthread_rwlock_unlock`:idx: + `posix.html#947 `_ + + `pthread_rwlock_wrlock`:idx: + `posix.html#948 `_ + + `PTHREAD_SCOPE_PROCESS`:idx: + `posix.html#473 `_ + + `PTHREAD_SCOPE_SYSTEM`:idx: + `posix.html#474 `_ + + `pthread_self`:idx: + `posix.html#953 `_ + + `pthread_setcancelstate`:idx: + `posix.html#954 `_ + + `pthread_setcanceltype`:idx: + `posix.html#955 `_ + + `pthread_setconcurrency`:idx: + `posix.html#956 `_ + + `pthread_setschedparam`:idx: + `posix.html#957 `_ + + `pthread_setschedprio`:idx: + `posix.html#958 `_ + + `pthread_setspecific`:idx: + `posix.html#959 `_ + + `pthread_sigmask`:idx: + `posix.html#1126 `_ + + `pthread_spin_destroy`:idx: + `posix.html#960 `_ + + `pthread_spin_init`:idx: + `posix.html#961 `_ + + `pthread_spin_lock`:idx: + `posix.html#962 `_ + + `pthread_spin_trylock`:idx: + `posix.html#963 `_ + + `pthread_spin_unlock`:idx: + `posix.html#964 `_ + + `pthread_testcancel`:idx: + `posix.html#965 `_ + + `Pulongf`:idx: + `zlib.html#104 `_ + + `push/pop`:idx: + `manual.html#228 `_ + + `putEnv`:idx: + `os.html#142 `_ + + `PWindow`:idx: + `dialogs.html#101 `_ + + `pwrite`:idx: + `posix.html#1017 `_ + + `Pzip`:idx: + `libzip.html#105 `_ + + `Pzip_file`:idx: + `libzip.html#106 `_ + + `PZipFileStream`:idx: + `zipfiles.html#108 `_ + + `Pzip_source`:idx: + `libzip.html#107 `_ + + `Pzip_stat`:idx: + `libzip.html#103 `_ + + `PZstream`:idx: + `zlib.html#114 `_ + + `quit`:idx: + * `system.html#478 `_ + * `system.html#479 `_ + + `QuitFailure`:idx: + `system.html#477 `_ + + `QuitSuccess`:idx: + `system.html#476 `_ + + `quotation mark`:idx: + `manual.html#128 `_ + + `quoteIfContainsWhite`:idx: + `strutils.html#140 `_ + + `RADIXCHAR`:idx: + `posix.html#439 `_ + + `raise`:idx: + `posix.html#1127 `_ + + `random`:idx: + `math.html#108 `_ + + `randomize`:idx: + `math.html#109 `_ + + `range`:idx: + `system.html#123 `_ + + `re-raised`:idx: + `manual.html#183 `_ + + `read`:idx: + `posix.html#1018 `_ + + `readBool`:idx: + `streams.html#106 `_ + + `readBuffer`:idx: + `system.html#506 `_ + + `ReadBytes`:idx: + `system.html#504 `_ + + `readChar`:idx: + * `system.html#490 `_ + * `streams.html#105 `_ + + `ReadChars`:idx: + `system.html#505 `_ + + `readdir`:idx: + `posix.html#802 `_ + + `readdir_r`:idx: + `posix.html#803 `_ + + `readFile`:idx: + `system.html#492 `_ + + `readFloat32`:idx: + `streams.html#111 `_ + + `readFloat64`:idx: + `streams.html#112 `_ + + `readInt16`:idx: + `streams.html#108 `_ + + `readInt32`:idx: + `streams.html#109 `_ + + `readInt64`:idx: + `streams.html#110 `_ + + `readInt8`:idx: + `streams.html#107 `_ + + `readLine`:idx: + * `system.html#500 `_ + * `streams.html#114 `_ + + `readlink`:idx: + `posix.html#1019 `_ + + `readStr`:idx: + `streams.html#113 `_ + + `realloc`:idx: + `system.html#415 `_ + + `Recursive module dependancies`:idx: + `manual.html#216 `_ + + `register`:idx: + `nimrodc.html#112 `_ + + `removeDir`:idx: + `os.html#137 `_ + + `removeFile`:idx: + `os.html#136 `_ + + `repeatChar`:idx: + `strutils.html#136 `_ + + `replaceStr`:idx: + * `strutils.html#115 `_ + * `strutils.html#116 `_ + + `repr`:idx: + `system.html#371 `_ + + `result`:idx: + * `manual.html#190 `_ + * `manual.html#201 `_ + + `return`:idx: + `manual.html#189 `_ + + `rewinddir`:idx: + `posix.html#804 `_ + + `rmdir`:idx: + `posix.html#1020 `_ + + `R_OK`:idx: + `posix.html#479 `_ + + `round`:idx: + `math.html#116 `_ + + `RTLD_GLOBAL`:idx: + `posix.html#217 `_ + + `RTLD_LAZY`:idx: + `posix.html#215 `_ + + `RTLD_LOCAL`:idx: + `posix.html#218 `_ + + `RTLD_NOW`:idx: + `posix.html#216 `_ + + `safe`:idx: + `manual.html#112 `_ + + `safecall`:idx: + `manual.html#166 `_ + + `sameFile`:idx: + `os.html#148 `_ + + `sameFileContent`:idx: + `os.html#149 `_ + + `SA_NOCLDSTOP`:idx: + `posix.html#754 `_ + + `SA_NOCLDWAIT`:idx: + `posix.html#762 `_ + + `SA_NODEFER`:idx: + `posix.html#763 `_ + + `SA_ONSTACK`:idx: + `posix.html#758 `_ + + `SA_RESETHAND`:idx: + `posix.html#759 `_ + + `SA_RESTART`:idx: + `posix.html#760 `_ + + `SA_SIGINFO`:idx: + `posix.html#761 `_ + + `SC_2_C_BIND`:idx: + `posix.html#519 `_ + + `SC_2_C_DEV`:idx: + `posix.html#520 `_ + + `SC_2_CHAR_TERM`:idx: + `posix.html#521 `_ + + `SC_2_FORT_DEV`:idx: + `posix.html#522 `_ + + `SC_2_FORT_RUN`:idx: + `posix.html#523 `_ + + `SC_2_LOCALEDEF`:idx: + `posix.html#524 `_ + + `SC_2_PBS`:idx: + `posix.html#525 `_ + + `SC_2_PBS_ACCOUNTING`:idx: + `posix.html#526 `_ + + `SC_2_PBS_CHECKPOINT`:idx: + `posix.html#527 `_ + + `SC_2_PBS_LOCATE`:idx: + `posix.html#528 `_ + + `SC_2_PBS_MESSAGE`:idx: + `posix.html#529 `_ + + `SC_2_PBS_TRACK`:idx: + `posix.html#530 `_ + + `SC_2_SW_DEV`:idx: + `posix.html#531 `_ + + `SC_2_UPE`:idx: + `posix.html#532 `_ + + `SC_2_VERSION`:idx: + `posix.html#533 `_ + + `SC_ADVISORY_INFO`:idx: + `posix.html#534 `_ + + `SC_AIO_LISTIO_MAX`:idx: + `posix.html#535 `_ + + `SC_AIO_MAX`:idx: + `posix.html#536 `_ + + `SC_AIO_PRIO_DELTA_MAX`:idx: + `posix.html#537 `_ + + `SC_ARG_MAX`:idx: + `posix.html#538 `_ + + `SC_ASYNCHRONOUS_IO`:idx: + `posix.html#539 `_ + + `SC_ATEXIT_MAX`:idx: + `posix.html#540 `_ + + `SC_BARRIERS`:idx: + `posix.html#541 `_ + + `SC_BC_BASE_MAX`:idx: + `posix.html#542 `_ + + `SC_BC_DIM_MAX`:idx: + `posix.html#543 `_ + + `SC_BC_SCALE_MAX`:idx: + `posix.html#544 `_ + + `SC_BC_STRING_MAX`:idx: + `posix.html#545 `_ + + `SC_CHILD_MAX`:idx: + `posix.html#546 `_ + + `SC_CLK_TCK`:idx: + `posix.html#547 `_ + + `SC_CLOCK_SELECTION`:idx: + `posix.html#548 `_ + + `SC_COLL_WEIGHTS_MAX`:idx: + `posix.html#549 `_ + + `SC_CPUTIME`:idx: + `posix.html#550 `_ + + `SC_DELAYTIMER_MAX`:idx: + `posix.html#551 `_ + + `SC_EXPR_NEST_MAX`:idx: + `posix.html#552 `_ + + `SC_FSYNC`:idx: + `posix.html#553 `_ + + `SC_GETGR_R_SIZE_MAX`:idx: + `posix.html#554 `_ + + `SC_GETPW_R_SIZE_MAX`:idx: + `posix.html#555 `_ + + `SCHED_FIFO`:idx: + `posix.html#770 `_ + + `sched_getparam`:idx: + `posix.html#1154 `_ + + `sched_get_priority_max`:idx: + `posix.html#1152 `_ + + `sched_get_priority_min`:idx: + `posix.html#1153 `_ + + `sched_getscheduler`:idx: + `posix.html#1155 `_ + + `SCHED_OTHER`:idx: + `posix.html#773 `_ + + `SCHED_RR`:idx: + `posix.html#771 `_ + + `sched_rr_get_interval`:idx: + `posix.html#1156 `_ + + `sched_setparam`:idx: + `posix.html#1157 `_ + + `sched_setscheduler`:idx: + `posix.html#1158 `_ + + `SCHED_SPORADIC`:idx: + `posix.html#772 `_ + + `sched_yield`:idx: + `posix.html#1159 `_ + + `SC_HOST_NAME_MAX`:idx: + `posix.html#556 `_ + + `SC_IOV_MAX`:idx: + `posix.html#557 `_ + + `SC_IPV6`:idx: + `posix.html#558 `_ + + `SC_JOB_CONTROL`:idx: + `posix.html#559 `_ + + `SC_LINE_MAX`:idx: + `posix.html#560 `_ + + `SC_LOGIN_NAME_MAX`:idx: + `posix.html#561 `_ + + `SC_MAPPED_FILES`:idx: + `posix.html#562 `_ + + `SC_MEMLOCK`:idx: + `posix.html#563 `_ + + `SC_MEMLOCK_RANGE`:idx: + `posix.html#564 `_ + + `SC_MEMORY_PROTECTION`:idx: + `posix.html#565 `_ + + `SC_MESSAGE_PASSING`:idx: + `posix.html#566 `_ + + `SC_MONOTONIC_CLOCK`:idx: + `posix.html#567 `_ + + `SC_MQ_OPEN_MAX`:idx: + `posix.html#568 `_ + + `SC_MQ_PRIO_MAX`:idx: + `posix.html#569 `_ + + `SC_NGROUPS_MAX`:idx: + `posix.html#570 `_ + + `scope`:idx: + * `manual.html#106 `_ + * `manual.html#217 `_ + + `SC_OPEN_MAX`:idx: + `posix.html#571 `_ + + `SC_PAGE_SIZE`:idx: + `posix.html#572 `_ + + `SC_PRIORITIZED_IO`:idx: + `posix.html#573 `_ + + `SC_PRIORITY_SCHEDULING`:idx: + `posix.html#574 `_ + + `SC_RAW_SOCKETS`:idx: + `posix.html#575 `_ + + `SC_READER_WRITER_LOCKS`:idx: + `posix.html#577 `_ + + `SC_REALTIME_SIGNALS`:idx: + `posix.html#578 `_ + + `SC_RE_DUP_MAX`:idx: + `posix.html#576 `_ + + `SC_REGEXP`:idx: + `posix.html#579 `_ + + `ScriptExt`:idx: + `os.html#108 `_ + + `SC_RTSIG_MAX`:idx: + `posix.html#580 `_ + + `SC_SAVED_IDS`:idx: + `posix.html#581 `_ + + `SC_SEMAPHORES`:idx: + `posix.html#584 `_ + + `SC_SEM_NSEMS_MAX`:idx: + `posix.html#582 `_ + + `SC_SEM_VALUE_MAX`:idx: + `posix.html#583 `_ + + `SC_SHARED_MEMORY_OBJECTS`:idx: + `posix.html#585 `_ + + `SC_SHELL`:idx: + `posix.html#586 `_ + + `SC_SIGQUEUE_MAX`:idx: + `posix.html#587 `_ + + `SC_SPAWN`:idx: + `posix.html#588 `_ + + `SC_SPIN_LOCKS`:idx: + `posix.html#589 `_ + + `SC_SPORADIC_SERVER`:idx: + `posix.html#590 `_ + + `SC_SS_REPL_MAX`:idx: + `posix.html#591 `_ + + `SC_STREAM_MAX`:idx: + `posix.html#592 `_ + + `SC_SYMLOOP_MAX`:idx: + `posix.html#593 `_ + + `SC_SYNCHRONIZED_IO`:idx: + `posix.html#594 `_ + + `SC_THREAD_ATTR_STACKADDR`:idx: + `posix.html#595 `_ + + `SC_THREAD_ATTR_STACKSIZE`:idx: + `posix.html#596 `_ + + `SC_THREAD_CPUTIME`:idx: + `posix.html#597 `_ + + `SC_THREAD_DESTRUCTOR_ITERATIONS`:idx: + `posix.html#598 `_ + + `SC_THREAD_KEYS_MAX`:idx: + `posix.html#599 `_ + + `SC_THREAD_PRIO_INHERIT`:idx: + `posix.html#600 `_ + + `SC_THREAD_PRIO_PROTECT`:idx: + `posix.html#601 `_ + + `SC_THREAD_PRIORITY_SCHEDULING`:idx: + `posix.html#602 `_ + + `SC_THREAD_PROCESS_SHARED`:idx: + `posix.html#603 `_ + + `SC_THREADS`:idx: + `posix.html#608 `_ + + `SC_THREAD_SAFE_FUNCTIONS`:idx: + `posix.html#604 `_ + + `SC_THREAD_SPORADIC_SERVER`:idx: + `posix.html#605 `_ + + `SC_THREAD_STACK_MIN`:idx: + `posix.html#606 `_ + + `SC_THREAD_THREADS_MAX`:idx: + `posix.html#607 `_ + + `SC_TIMEOUTS`:idx: + `posix.html#609 `_ + + `SC_TIMER_MAX`:idx: + `posix.html#610 `_ + + `SC_TIMERS`:idx: + `posix.html#611 `_ + + `SC_TRACE`:idx: + `posix.html#612 `_ + + `SC_TRACE_EVENT_FILTER`:idx: + `posix.html#613 `_ + + `SC_TRACE_EVENT_NAME_MAX`:idx: + `posix.html#614 `_ + + `SC_TRACE_INHERIT`:idx: + `posix.html#615 `_ + + `SC_TRACE_LOG`:idx: + `posix.html#616 `_ + + `SC_TRACE_NAME_MAX`:idx: + `posix.html#617 `_ + + `SC_TRACE_SYS_MAX`:idx: + `posix.html#618 `_ + + `SC_TRACE_USER_EVENT_MAX`:idx: + `posix.html#619 `_ + + `SC_TTY_NAME_MAX`:idx: + `posix.html#620 `_ + + `SC_TYPED_MEMORY_OBJECTS`:idx: + `posix.html#621 `_ + + `SC_TZNAME_MAX`:idx: + `posix.html#622 `_ + + `SC_V6_ILP32_OFF32`:idx: + `posix.html#623 `_ + + `SC_V6_ILP32_OFFBIG`:idx: + `posix.html#624 `_ + + `SC_V6_LP64_OFF64`:idx: + `posix.html#625 `_ + + `SC_V6_LPBIG_OFFBIG`:idx: + `posix.html#626 `_ + + `SC_VERSION`:idx: + `posix.html#627 `_ + + `SC_XBS5_ILP32_OFF32`:idx: + `posix.html#628 `_ + + `SC_XBS5_ILP32_OFFBIG`:idx: + `posix.html#629 `_ + + `SC_XBS5_LP64_OFF64`:idx: + `posix.html#630 `_ + + `SC_XBS5_LPBIG_OFFBIG`:idx: + `posix.html#631 `_ + + `SC_XOPEN_CRYPT`:idx: + `posix.html#632 `_ + + `SC_XOPEN_ENH_I18N`:idx: + `posix.html#633 `_ + + `SC_XOPEN_LEGACY`:idx: + `posix.html#634 `_ + + `SC_XOPEN_REALTIME`:idx: + `posix.html#635 `_ + + `SC_XOPEN_REALTIME_THREADS`:idx: + `posix.html#636 `_ + + `SC_XOPEN_SHM`:idx: + `posix.html#637 `_ + + `SC_XOPEN_STREAMS`:idx: + `posix.html#638 `_ + + `SC_XOPEN_UNIX`:idx: + `posix.html#639 `_ + + `SC_XOPEN_VERSION`:idx: + `posix.html#640 `_ + + `SEEK_CUR`:idx: + `posix.html#776 `_ + + `seekdir`:idx: + `posix.html#805 `_ + + `SEEK_END`:idx: + `posix.html#777 `_ + + `SEEK_SET`:idx: + `posix.html#775 `_ + + `select`:idx: + `posix.html#1166 `_ + + `sem_close`:idx: + `posix.html#1045 `_ + + `sem_destroy`:idx: + `posix.html#1046 `_ + + `SEM_FAILED`:idx: + `posix.html#641 `_ + + `sem_getvalue`:idx: + `posix.html#1047 `_ + + `sem_init`:idx: + `posix.html#1048 `_ + + `sem_open`:idx: + `posix.html#1049 `_ + + `sem_post`:idx: + `posix.html#1050 `_ + + `sem_timedwait`:idx: + `posix.html#1051 `_ + + `sem_trywait`:idx: + `posix.html#1052 `_ + + `sem_unlink`:idx: + `posix.html#1053 `_ + + `sem_wait`:idx: + `posix.html#1054 `_ + + `separate compilation`:idx: + * `manual.html#214 `_ + * `tut1.html#127 `_ + + `seq`:idx: + `system.html#126 `_ + + `seqToPtr`:idx: + `system.html#457 `_ + + `Sequences`:idx: + * `manual.html#153 `_ + * `tut1.html#119 `_ + + `set`:idx: + `system.html#127 `_ + + `set type`:idx: + * `manual.html#157 `_ + * `tut1.html#116 `_ + + `setcontext`:idx: + `posix.html#1190 `_ + + `setCurrentDir`:idx: + `os.html#113 `_ + + `setegid`:idx: + `posix.html#1021 `_ + + `seteuid`:idx: + `posix.html#1022 `_ + + `setFilePos`:idx: + `system.html#510 `_ + + `setgid`:idx: + `posix.html#1023 `_ + + `setgrent`:idx: + `posix.html#839 `_ + + `setLen`:idx: + * `system.html#407 `_ + * `system.html#417 `_ + + `setlocale`:idx: + `posix.html#847 `_ + + `setpgid`:idx: + `posix.html#1024 `_ + + `setpgrp`:idx: + `posix.html#1025 `_ + + `setpwent`:idx: + `posix.html#865 `_ + + `setregid`:idx: + `posix.html#1026 `_ + + `setreuid`:idx: + `posix.html#1027 `_ + + `setsid`:idx: + `posix.html#1028 `_ + + `setuid`:idx: + `posix.html#1029 `_ + + `shl`:idx: + * `system.html#226 `_ + * `system.html#227 `_ + * `system.html#228 `_ + * `system.html#229 `_ + * `system.html#230 `_ + + `shm_open`:idx: + `posix.html#1090 `_ + + `shm_unlink`:idx: + `posix.html#1091 `_ + + `shr`:idx: + * `system.html#221 `_ + * `system.html#222 `_ + * `system.html#223 `_ + * `system.html#224 `_ + * `system.html#225 `_ + + `S_IFBLK`:idx: + `posix.html#650 `_ + + `S_IFCHR`:idx: + `posix.html#651 `_ + + `S_IFDIR`:idx: + `posix.html#654 `_ + + `S_IFIFO`:idx: + `posix.html#652 `_ + + `S_IFLNK`:idx: + `posix.html#655 `_ + + `S_IFMT`:idx: + `posix.html#649 `_ + + `S_IFREG`:idx: + `posix.html#653 `_ + + `S_IFSOCK`:idx: + `posix.html#656 `_ + + `SIGABRT`:idx: + `posix.html#726 `_ + + `sigaction`:idx: + `posix.html#1128 `_ + + `sigaddset`:idx: + `posix.html#1129 `_ + + `SIGALRM`:idx: + `posix.html#727 `_ + + `sigaltstack`:idx: + `posix.html#1130 `_ + + `SIG_BLOCK`:idx: + `posix.html#755 `_ + + `SIGBUS`:idx: + `posix.html#728 `_ + + `SIGCHLD`:idx: + `posix.html#729 `_ + + `SIGCONT`:idx: + `posix.html#730 `_ + + `sigdelset`:idx: + `posix.html#1131 `_ + + `SIG_DFL`:idx: + `posix.html#719 `_ + + `sigemptyset`:idx: + `posix.html#1132 `_ + + `SIG_ERR`:idx: + `posix.html#720 `_ + + `SIGEV_NONE`:idx: + `posix.html#723 `_ + + `SIGEV_SIGNAL`:idx: + `posix.html#724 `_ + + `SIGEV_THREAD`:idx: + `posix.html#725 `_ + + `sigfillset`:idx: + `posix.html#1133 `_ + + `SIGFPE`:idx: + `posix.html#731 `_ + + `sighold`:idx: + `posix.html#1134 `_ + + `SIGHUP`:idx: + `posix.html#732 `_ + + `SIG_IGN`:idx: + `posix.html#722 `_ + + `sigignore`:idx: + `posix.html#1135 `_ + + `SIGILL`:idx: + `posix.html#733 `_ + + `SIGINT`:idx: + `posix.html#734 `_ + + `siginterrupt`:idx: + `posix.html#1136 `_ + + `sigismember`:idx: + `posix.html#1137 `_ + + `SIGKILL`:idx: + `posix.html#735 `_ + + `signal`:idx: + `posix.html#1138 `_ + + `sigpause`:idx: + `posix.html#1139 `_ + + `sigpending`:idx: + `posix.html#1140 `_ + + `SIGPIPE`:idx: + `posix.html#736 `_ + + `SIGPOLL`:idx: + `posix.html#746 `_ + + `sigprocmask`:idx: + `posix.html#1141 `_ + + `SIGPROF`:idx: + `posix.html#747 `_ + + `sigqueue`:idx: + `posix.html#1142 `_ + + `SIGQUIT`:idx: + `posix.html#737 `_ + + `sigrelse`:idx: + `posix.html#1143 `_ + + `SIGSEGV`:idx: + `posix.html#738 `_ + + `sigset`:idx: + `posix.html#1144 `_ + + `SIG_SETMASK`:idx: + `posix.html#757 `_ + + `SIGSTKSZ`:idx: + `posix.html#767 `_ + + `SIGSTOP`:idx: + `posix.html#739 `_ + + `sigsuspend`:idx: + `posix.html#1145 `_ + + `SIGSYS`:idx: + `posix.html#748 `_ + + `SIGTERM`:idx: + `posix.html#740 `_ + + `sigtimedwait`:idx: + `posix.html#1146 `_ + + `SIGTRAP`:idx: + `posix.html#749 `_ + + `SIGTSTP`:idx: + `posix.html#741 `_ + + `SIGTTIN`:idx: + `posix.html#742 `_ + + `SIGTTOU`:idx: + `posix.html#743 `_ + + `SIG_UNBLOCK`:idx: + `posix.html#756 `_ + + `SIGURG`:idx: + `posix.html#750 `_ + + `SIGUSR1`:idx: + `posix.html#744 `_ + + `SIGUSR2`:idx: + `posix.html#745 `_ + + `SIGVTALRM`:idx: + `posix.html#751 `_ + + `sigwait`:idx: + `posix.html#1147 `_ + + `sigwaitinfo`:idx: + `posix.html#1148 `_ + + `SIGXCPU`:idx: + `posix.html#752 `_ + + `SIGXFSZ`:idx: + `posix.html#753 `_ + + `simple assertions`:idx: + `regexprs.html#103 `_ + + `simple statements`:idx: + `manual.html#174 `_ + + `sinh`:idx: + `math.html#124 `_ + + `S_IRGRP`:idx: + `posix.html#662 `_ + + `S_IROTH`:idx: + `posix.html#666 `_ + + `S_IRUSR`:idx: + `posix.html#658 `_ + + `S_IRWXG`:idx: + `posix.html#661 `_ + + `S_IRWXO`:idx: + `posix.html#665 `_ + + `S_IRWXU`:idx: + `posix.html#657 `_ + + `S_ISBLK`:idx: + `posix.html#1067 `_ + + `S_ISCHR`:idx: + `posix.html#1068 `_ + + `S_ISDIR`:idx: + `posix.html#1069 `_ + + `S_ISFIFO`:idx: + `posix.html#1070 `_ + + `S_ISGID`:idx: + `posix.html#670 `_ + + `S_ISLNK`:idx: + `posix.html#1072 `_ + + `S_ISREG`:idx: + `posix.html#1071 `_ + + `S_ISSOCK`:idx: + `posix.html#1073 `_ + + `S_ISUID`:idx: + `posix.html#669 `_ + + `S_ISVTX`:idx: + `posix.html#671 `_ + + `S_IWGRP`:idx: + `posix.html#663 `_ + + `S_IWOTH`:idx: + `posix.html#667 `_ + + `S_IWUSR`:idx: + `posix.html#659 `_ + + `S_IXGRP`:idx: + `posix.html#664 `_ + + `S_IXOTH`:idx: + `posix.html#668 `_ + + `S_IXUSR`:idx: + `posix.html#660 `_ + + `sizeof`:idx: + `system.html#156 `_ + + `sleep`:idx: + `posix.html#1030 `_ + + `split`:idx: + `strutils.html#119 `_ + + `SplitFilename`:idx: + `os.html#125 `_ + + `splitLines`:idx: + `strutils.html#120 `_ + + `splitLinesSeq`:idx: + `strutils.html#121 `_ + + `SplitPath`:idx: + `os.html#121 `_ + + `splitSeq`:idx: + `strutils.html#122 `_ + + `SQL_ACCESS_MODE`:idx: + `odbcsql.html#406 `_ + + `SQL_ADD`:idx: + `odbcsql.html#317 `_ + + `SQLAllocHandle`:idx: + `odbcsql.html#627 `_ + + `SQL_ALL_TYPES`:idx: + `odbcsql.html#492 `_ + + `SQL_API_SQLDESCRIBEPARAM`:idx: + `odbcsql.html#229 `_ + + `SQL_ARD_TYPE`:idx: + `odbcsql.html#494 `_ + + `SQL_ASYNC_ENABLE`:idx: + `odbcsql.html#383 `_ + + `SQL_ATTR_ACCESS_MODE`:idx: + `odbcsql.html#415 `_ + + `SQL_ATTR_APP_PARAM_DESC`:idx: + `odbcsql.html#374 `_ + + `SQL_ATTR_APP_ROW_DESC`:idx: + `odbcsql.html#373 `_ + + `SQL_ATTR_AUTOCOMMIT`:idx: + `odbcsql.html#400 `_ + + `SQL_ATTR_AUTO_IPD`:idx: + `odbcsql.html#371 `_ + + `SQL_ATTR_CONCURRENCY`:idx: + `odbcsql.html#395 `_ + + `SQL_ATTR_CONNECTION_DEAD`:idx: + `odbcsql.html#416 `_ + + `SQL_ATTR_CONNECTION_TIMEOUT`:idx: + `odbcsql.html#417 `_ + + `SQL_ATTR_CURRENT_CATALOG`:idx: + `odbcsql.html#418 `_ + + `SQL_ATTR_CURSOR_SCROLLABLE`:idx: + `odbcsql.html#377 `_ + + `SQL_ATTR_CURSOR_SENSITIVITY`:idx: + `odbcsql.html#378 `_ + + `SQL_ATTR_CURSOR_TYPE`:idx: + `odbcsql.html#394 `_ + + `SQL_ATTR_DISCONNECT_BEHAVIOR`:idx: + `odbcsql.html#419 `_ + + `SQL_ATTR_ENLIST_IN_DTC`:idx: + `odbcsql.html#420 `_ + + `SQL_ATTR_ENLIST_IN_XA`:idx: + `odbcsql.html#421 `_ + + `SQL_ATTR_FETCH_BOOKMARK_PTR`:idx: + `odbcsql.html#396 `_ + + `SQL_ATTR_IMP_PARAM_DESC`:idx: + `odbcsql.html#376 `_ + + `SQL_ATTR_IMP_ROW_DESC`:idx: + `odbcsql.html#375 `_ + + `SQL_ATTR_LOGIN_TIMEOUT`:idx: + `odbcsql.html#422 `_ + + `SQL_ATTR_MAX_ROWS`:idx: + `odbcsql.html#404 `_ + + `SQL_ATTR_METADATA_ID`:idx: + `odbcsql.html#372 `_ + + `SQL_ATTR_ODBC_CURSORS`:idx: + `odbcsql.html#341 `_ + + `SQL_ATTR_ODBC_VERSION`:idx: + `odbcsql.html#240 `_ + + `SQL_ATTR_OUTPUT_NTS`:idx: + `odbcsql.html#370 `_ + + `SQL_ATTR_PACKET_SIZE`:idx: + `odbcsql.html#423 `_ + + `SQL_ATTR_QUIET_MODE`:idx: + `odbcsql.html#424 `_ + + `SQL_ATTR_ROW_ARRAY_SIZE`:idx: + `odbcsql.html#620 `_ + + `SQL_ATTR_ROW_NUMBER`:idx: + `odbcsql.html#401 `_ + + `SQL_ATTR_ROWS_FETCHED_PTR`:idx: + `odbcsql.html#398 `_ + + `SQL_ATTR_ROW_STATUS_PTR`:idx: + `odbcsql.html#397 `_ + + `SQL_ATTR_TRACE`:idx: + `odbcsql.html#425 `_ + + `SQL_ATTR_TRACEFILE`:idx: + `odbcsql.html#426 `_ + + `SQL_ATTR_TRANSLATE_LIB`:idx: + `odbcsql.html#427 `_ + + `SQL_ATTR_TRANSLATE_OPTION`:idx: + `odbcsql.html#428 `_ + + `SQL_ATTR_TXN_ISOLATION`:idx: + `odbcsql.html#403 `_ + + `SQL_ATTR_USE_BOOKMARKS`:idx: + `odbcsql.html#405 `_ + + `SQL_AUTOCOMMIT`:idx: + `odbcsql.html#399 `_ + + `SQL_AUTOCOMMIT_DEFAULT`:idx: + `odbcsql.html#434 `_ + + `SQL_AUTOCOMMIT_OFF`:idx: + `odbcsql.html#432 `_ + + `SQL_AUTOCOMMIT_ON`:idx: + `odbcsql.html#433 `_ + + `SQL_BEST_ROWID`:idx: + `odbcsql.html#523 `_ + + `SQL_BIGINT`:idx: + `odbcsql.html#130 `_ + + `SQL_BINARY`:idx: + `odbcsql.html#127 `_ + + `SQLBindCol`:idx: + `odbcsql.html#652 `_ + + `SQLBindParameter`:idx: + `odbcsql.html#660 `_ + + `SQL_BIND_TYPE`:idx: + `odbcsql.html#384 `_ + + `SQL_BIT`:idx: + `odbcsql.html#132 `_ + + `SQL_BOOKMARK_PERSISTENCE`:idx: + `odbcsql.html#262 `_ + + `SQL_BP_CLOSE`:idx: + `odbcsql.html#264 `_ + + `SQL_BP_DELETE`:idx: + `odbcsql.html#265 `_ + + `SQL_BP_DROP`:idx: + `odbcsql.html#266 `_ + + `SQL_BP_OTHER_HSTMT`:idx: + `odbcsql.html#269 `_ + + `SQL_BP_SCROLL`:idx: + `odbcsql.html#270 `_ + + `SQL_BP_TRANSACTION`:idx: + `odbcsql.html#267 `_ + + `SQL_BP_UPDATE`:idx: + `odbcsql.html#268 `_ + + `SQLBrowseConnect`:idx: + `odbcsql.html#636 `_ + + `SQLBulkOperations`:idx: + `odbcsql.html#650 `_ + + `SQL_CA1_ABSOLUTE`:idx: + `odbcsql.html#282 `_ + + `SQL_CA1_BOOKMARK`:idx: + `odbcsql.html#284 `_ + + `SQL_CA1_BULK_ADD`:idx: + `odbcsql.html#295 `_ + + `SQL_CA1_BULK_DELETE_BY_BOOKMARK`:idx: + `odbcsql.html#297 `_ + + `SQL_CA1_BULK_FETCH_BY_BOOKMARK`:idx: + `odbcsql.html#298 `_ + + `SQL_CA1_BULK_UPDATE_BY_BOOKMARK`:idx: + `odbcsql.html#296 `_ + + `SQL_CA1_LOCK_EXCLUSIVE`:idx: + `odbcsql.html#286 `_ + + `SQL_CA1_LOCK_NO_CHANGE`:idx: + `odbcsql.html#285 `_ + + `SQL_CA1_LOCK_UNLOCK`:idx: + `odbcsql.html#287 `_ + + `SQL_CA1_NEXT`:idx: + `odbcsql.html#281 `_ + + `SQL_CA1_POS_DELETE`:idx: + `odbcsql.html#290 `_ + + `SQL_CA1_POSITIONED_DELETE`:idx: + `odbcsql.html#293 `_ + + `SQL_CA1_POSITIONED_UPDATE`:idx: + `odbcsql.html#292 `_ + + `SQL_CA1_POS_POSITION`:idx: + `odbcsql.html#288 `_ + + `SQL_CA1_POS_REFRESH`:idx: + `odbcsql.html#291 `_ + + `SQL_CA1_POS_UPDATE`:idx: + `odbcsql.html#289 `_ + + `SQL_CA1_RELATIVE`:idx: + `odbcsql.html#283 `_ + + `SQL_CA1_SELECT_FOR_UPDATE`:idx: + `odbcsql.html#294 `_ + + `SQL_CA2_CRC_APPROXIMATE`:idx: + `odbcsql.html#313 `_ + + `SQL_CA2_CRC_EXACT`:idx: + `odbcsql.html#312 `_ + + `SQL_CA2_LOCK_CONCURRENCY`:idx: + `odbcsql.html#300 `_ + + `SQL_CA2_MAX_ROWS_AFFECTS_ALL`:idx: + `odbcsql.html#311 `_ + + `SQL_CA2_MAX_ROWS_CATALOG`:idx: + `odbcsql.html#310 `_ + + `SQL_CA2_MAX_ROWS_DELETE`:idx: + `odbcsql.html#308 `_ + + `SQL_CA2_MAX_ROWS_INSERT`:idx: + `odbcsql.html#307 `_ + + `SQL_CA2_MAX_ROWS_SELECT`:idx: + `odbcsql.html#306 `_ + + `SQL_CA2_MAX_ROWS_UPDATE`:idx: + `odbcsql.html#309 `_ + + `SQL_CA2_OPT_ROWVER_CONCURRENCY`:idx: + `odbcsql.html#301 `_ + + `SQL_CA2_OPT_VALUES_CONCURRENCY`:idx: + `odbcsql.html#302 `_ + + `SQL_CA2_READ_ONLY_CONCURRENCY`:idx: + `odbcsql.html#299 `_ + + `SQL_CA2_SENSITIVITY_ADDITIONS`:idx: + `odbcsql.html#303 `_ + + `SQL_CA2_SENSITIVITY_DELETIONS`:idx: + `odbcsql.html#304 `_ + + `SQL_CA2_SENSITIVITY_UPDATES`:idx: + `odbcsql.html#305 `_ + + `SQL_CA2_SIMULATE_NON_UNIQUE`:idx: + `odbcsql.html#314 `_ + + `SQL_CA2_SIMULATE_TRY_UNIQUE`:idx: + `odbcsql.html#315 `_ + + `SQL_CA2_SIMULATE_UNIQUE`:idx: + `odbcsql.html#316 `_ + + `SQL_CATALOG_NAME`:idx: + `odbcsql.html#545 `_ + + `SQL_C_BINARY`:idx: + `odbcsql.html#212 `_ + + `SQL_C_BIT`:idx: + `odbcsql.html#213 `_ + + `SQL_C_BOOKMARK`:idx: + `odbcsql.html#223 `_ + + `SQL_C_CHAR`:idx: + `odbcsql.html#184 `_ + + `SQL_C_DATE`:idx: + `odbcsql.html#193 `_ + + `SQL_C_DEFAULT`:idx: + `odbcsql.html#190 `_ + + `SQL_C_DOUBLE`:idx: + `odbcsql.html#188 `_ + + `SQL_C_FLOAT`:idx: + `odbcsql.html#187 `_ + + `SQL_C_GUID`:idx: + `odbcsql.html#224 `_ + + `SQL_CHAR`:idx: + `odbcsql.html#136 `_ + + `SQL_C_INTERVAL_DAY`:idx: + `odbcsql.html#201 `_ + + `SQL_C_INTERVAL_DAY_TO_HOUR`:idx: + `odbcsql.html#206 `_ + + `SQL_C_INTERVAL_DAY_TO_MINUTE`:idx: + `odbcsql.html#207 `_ + + `SQL_C_INTERVAL_DAY_TO_SECOND`:idx: + `odbcsql.html#208 `_ + + `SQL_C_INTERVAL_HOUR`:idx: + `odbcsql.html#202 `_ + + `SQL_C_INTERVAL_HOUR_TO_MINUTE`:idx: + `odbcsql.html#209 `_ + + `SQL_C_INTERVAL_HOUR_TO_SECOND`:idx: + `odbcsql.html#210 `_ + + `SQL_C_INTERVAL_MINUTE`:idx: + `odbcsql.html#203 `_ + + `SQL_C_INTERVAL_MINUTE_TO_SECOND`:idx: + `odbcsql.html#211 `_ + + `SQL_C_INTERVAL_MONTH`:idx: + `odbcsql.html#200 `_ + + `SQL_C_INTERVAL_SECOND`:idx: + `odbcsql.html#204 `_ + + `SQL_C_INTERVAL_YEAR`:idx: + `odbcsql.html#199 `_ + + `SQL_C_INTERVAL_YEAR_TO_MONTH`:idx: + `odbcsql.html#205 `_ + + `SQL_C_LONG`:idx: + `odbcsql.html#185 `_ + + `SQL_CLOSE`:idx: + `odbcsql.html#503 `_ + + `SQLCloseCursor`:idx: + `odbcsql.html#639 `_ + + `SQL_C_NUMERIC`:idx: + `odbcsql.html#189 `_ + + `SQL_CODE_DATE`:idx: + `odbcsql.html#495 `_ + + `SQL_CODE_DAY`:idx: + `odbcsql.html#156 `_ + + `SQL_CODE_DAY_TO_HOUR`:idx: + `odbcsql.html#161 `_ + + `SQL_CODE_DAY_TO_MINUTE`:idx: + `odbcsql.html#162 `_ + + `SQL_CODE_DAY_TO_SECOND`:idx: + `odbcsql.html#163 `_ + + `SQL_CODE_HOUR`:idx: + `odbcsql.html#157 `_ + + `SQL_CODE_HOUR_TO_MINUTE`:idx: + `odbcsql.html#164 `_ + + `SQL_CODE_HOUR_TO_SECOND`:idx: + `odbcsql.html#165 `_ + + `SQL_CODE_MINUTE`:idx: + `odbcsql.html#158 `_ + + `SQL_CODE_MINUTE_TO_SECOND`:idx: + `odbcsql.html#166 `_ + + `SQL_CODE_MONTH`:idx: + `odbcsql.html#155 `_ + + `SQL_CODE_SECOND`:idx: + `odbcsql.html#159 `_ + + `SQL_CODE_TIME`:idx: + `odbcsql.html#496 `_ + + `SQL_CODE_TIMESTAMP`:idx: + `odbcsql.html#497 `_ + + `SQL_CODE_YEAR`:idx: + `odbcsql.html#154 `_ + + `SQL_CODE_YEAR_TO_MONTH`:idx: + `odbcsql.html#160 `_ + + `SQL_COLATT_OPT_MAX`:idx: + `odbcsql.html#588 `_ + + `SQLColAttribute`:idx: + `odbcsql.html#662 `_ + + `SQL_COLLATION_SEQ`:idx: + `odbcsql.html#546 `_ + + `SQL_COLUMN_AUTO_INCREMENT`:idx: + `odbcsql.html#580 `_ + + `SQL_COLUMN_CASE_SENSITIVE`:idx: + `odbcsql.html#581 `_ + + `SQL_COLUMN_COUNT`:idx: + `odbcsql.html#569 `_ + + `SQL_COLUMN_DISPLAY_SIZE`:idx: + `odbcsql.html#575 `_ + + `SQL_COLUMN_DRIVER_START`:idx: + `odbcsql.html#589 `_ + + `SQL_COLUMN_LABEL`:idx: + `odbcsql.html#587 `_ + + `SQL_COLUMN_LENGTH`:idx: + `odbcsql.html#572 `_ + + `SQL_COLUMN_MONEY`:idx: + `odbcsql.html#578 `_ + + `SQL_COLUMN_NAME`:idx: + `odbcsql.html#570 `_ + + `SQL_COLUMN_NULLABLE`:idx: + `odbcsql.html#576 `_ + + `SQL_COLUMN_OWNER_NAME`:idx: + `odbcsql.html#585 `_ + + `SQL_COLUMN_PRECISION`:idx: + `odbcsql.html#573 `_ + + `SQL_COLUMN_QUALIFIER_NAME`:idx: + `odbcsql.html#586 `_ + + `SQLColumns`:idx: + `odbcsql.html#665 `_ + + `SQL_COLUMN_SCALE`:idx: + `odbcsql.html#574 `_ + + `SQL_COLUMN_SEARCHABLE`:idx: + `odbcsql.html#582 `_ + + `SQL_COLUMN_TABLE_NAME`:idx: + `odbcsql.html#584 `_ + + `SQL_COLUMN_TYPE`:idx: + `odbcsql.html#571 `_ + + `SQL_COLUMN_TYPE_NAME`:idx: + `odbcsql.html#583 `_ + + `SQL_COLUMN_UNSIGNED`:idx: + `odbcsql.html#577 `_ + + `SQL_COLUMN_UPDATABLE`:idx: + `odbcsql.html#579 `_ + + `SQL_COMMIT`:idx: + `odbcsql.html#618 `_ + + `SQL_CONCUR_DEFAULT`:idx: + `odbcsql.html#446 `_ + + `SQL_CONCUR_LOCK`:idx: + `odbcsql.html#443 `_ + + `SQL_CONCUR_READ_ONLY`:idx: + `odbcsql.html#442 `_ + + `SQL_CONCURRENCY`:idx: + `odbcsql.html#386 `_ + + `SQL_CONCUR_ROWVER`:idx: + `odbcsql.html#444 `_ + + `SQL_CONCUR_VALUES`:idx: + `odbcsql.html#445 `_ + + `SQLConnect`:idx: + `odbcsql.html#633 `_ + + `SQL_C_SBIGINT`:idx: + `odbcsql.html#214 `_ + + `SQL_C_SHORT`:idx: + `odbcsql.html#186 `_ + + `SQL_C_SLONG`:idx: + `odbcsql.html#217 `_ + + `SQL_C_SSHORT`:idx: + `odbcsql.html#218 `_ + + `SQL_C_STINYINT`:idx: + `odbcsql.html#219 `_ + + `SQL_C_TIME`:idx: + `odbcsql.html#194 `_ + + `SQL_C_TIMESTAMP`:idx: + `odbcsql.html#195 `_ + + `SQL_C_TINYINT`:idx: + `odbcsql.html#216 `_ + + `SQL_C_TYPE_DATE`:idx: + `odbcsql.html#196 `_ + + `SQL_C_TYPE_TIME`:idx: + `odbcsql.html#197 `_ + + `SQL_C_TYPE_TIMESTAMP`:idx: + `odbcsql.html#198 `_ + + `SQL_C_UBIGINT`:idx: + `odbcsql.html#215 `_ + + `SQL_C_ULONG`:idx: + `odbcsql.html#220 `_ + + `SQL_CUR_DEFAULT`:idx: + `odbcsql.html#345 `_ + + `SQL_CURRENT_QUALIFIER`:idx: + `odbcsql.html#412 `_ + + `SQL_CURSOR_DYNAMIC`:idx: + `odbcsql.html#439 `_ + + `SQL_CURSOR_FORWARD_ONLY`:idx: + `odbcsql.html#437 `_ + + `SQL_CURSOR_KEYSET_DRIVEN`:idx: + `odbcsql.html#438 `_ + + `SQL_CURSOR_SENSITIVITY`:idx: + `odbcsql.html#543 `_ + + `SQL_CURSOR_STATIC`:idx: + `odbcsql.html#440 `_ + + `SQL_CURSOR_TYPE`:idx: + `odbcsql.html#385 `_ + + `SQL_CURSOR_TYPE_DEFAULT`:idx: + `odbcsql.html#441 `_ + + `SQL_CUR_USE_DRIVER`:idx: + `odbcsql.html#344 `_ + + `SQL_CUR_USE_IF_NEEDED`:idx: + `odbcsql.html#342 `_ + + `SQL_CUR_USE_ODBC`:idx: + `odbcsql.html#343 `_ + + `SQL_C_USHORT`:idx: + `odbcsql.html#221 `_ + + `SQL_C_UTINYINT`:idx: + `odbcsql.html#222 `_ + + `SQL_C_VARBOOKMARK`:idx: + `odbcsql.html#228 `_ + + `SQL_DATA_AT_EXEC`:idx: + `odbcsql.html#353 `_ + + `SQLDataSources`:idx: + `odbcsql.html#654 `_ + + `SQL_DATE`:idx: + `odbcsql.html#149 `_ + + `SQL_DATE_LEN`:idx: + `odbcsql.html#363 `_ + + `SQL_DATE_STRUCT`:idx: + `odbcsql.html#231 `_ + + `SQL_DATETIME`:idx: + `odbcsql.html#144 `_ + + `SQL_DECIMAL`:idx: + `odbcsql.html#138 `_ + + `SQL_DEFAULT`:idx: + `odbcsql.html#493 `_ + + `SQL_DELETE`:idx: + `odbcsql.html#325 `_ + + `SQL_DELETE_BY_BOOKMARK`:idx: + `odbcsql.html#320 `_ + + `SQL_DESC_ALLOC_TYPE`:idx: + `odbcsql.html#460 `_ + + `SQL_DESC_ARRAY_SIZE`:idx: + `odbcsql.html#590 `_ + + `SQL_DESC_ARRAY_STATUS_PTR`:idx: + `odbcsql.html#591 `_ + + `SQL_DESC_AUTO_UNIQUE_VALUE`:idx: + `odbcsql.html#592 `_ + + `SQL_DESC_BASE_COLUMN_NAME`:idx: + `odbcsql.html#593 `_ + + `SQL_DESC_BASE_TABLE_NAME`:idx: + `odbcsql.html#594 `_ + + `SQL_DESC_BIND_OFFSET_PTR`:idx: + `odbcsql.html#595 `_ + + `SQL_DESC_BIND_TYPE`:idx: + `odbcsql.html#596 `_ + + `SQL_DESC_CASE_SENSITIVE`:idx: + `odbcsql.html#597 `_ + + `SQL_DESC_CATALOG_NAME`:idx: + `odbcsql.html#598 `_ + + `SQL_DESC_CONCISE_TYPE`:idx: + `odbcsql.html#599 `_ + + `SQL_DESC_COUNT`:idx: + `odbcsql.html#447 `_ + + `SQL_DESC_DATA_PTR`:idx: + `odbcsql.html#456 `_ + + `SQL_DESC_DATETIME_INTERVAL_CODE`:idx: + `odbcsql.html#453 `_ + + `SQL_DESC_DATETIME_INTERVAL_PRECISION`:idx: + `odbcsql.html#600 `_ + + `SQL_DESC_DISPLAY_SIZE`:idx: + `odbcsql.html#601 `_ + + `SQL_DESC_FIXED_PREC_SCALE`:idx: + `odbcsql.html#602 `_ + + `SQL_DESC_INDICATOR_PTR`:idx: + `odbcsql.html#455 `_ + + `SQL_DESC_LABEL`:idx: + `odbcsql.html#603 `_ + + `SQL_DESC_LENGTH`:idx: + `odbcsql.html#449 `_ + + `SQL_DESC_LITERAL_PREFIX`:idx: + `odbcsql.html#604 `_ + + `SQL_DESC_LITERAL_SUFFIX`:idx: + `odbcsql.html#605 `_ + + `SQL_DESC_LOCAL_TYPE_NAME`:idx: + `odbcsql.html#606 `_ + + `SQL_DESC_MAXIMUM_SCALE`:idx: + `odbcsql.html#607 `_ + + `SQL_DESC_MINIMUM_SCALE`:idx: + `odbcsql.html#608 `_ + + `SQL_DESC_NAME`:idx: + `odbcsql.html#457 `_ + + `SQL_DESC_NULLABLE`:idx: + `odbcsql.html#454 `_ + + `SQL_DESC_NUM_PREC_RADIX`:idx: + `odbcsql.html#609 `_ + + `SQL_DESC_OCTET_LENGTH`:idx: + `odbcsql.html#459 `_ + + `SQL_DESC_OCTET_LENGTH_PTR`:idx: + `odbcsql.html#450 `_ + + `SQL_DESC_PARAMETER_TYPE`:idx: + `odbcsql.html#610 `_ + + `SQL_DESC_PRECISION`:idx: + `odbcsql.html#451 `_ + + `SQLDescribeCol`:idx: + `odbcsql.html#643 `_ + + `SQL_DESCRIBE_PARAMETER`:idx: + `odbcsql.html#544 `_ + + `SQL_DESC_ROWS_PROCESSED_PTR`:idx: + `odbcsql.html#611 `_ + + `SQL_DESC_SCALE`:idx: + `odbcsql.html#452 `_ + + `SQL_DESC_SCHEMA_NAME`:idx: + `odbcsql.html#612 `_ + + `SQL_DESC_SEARCHABLE`:idx: + `odbcsql.html#613 `_ + + `SQL_DESC_TABLE_NAME`:idx: + `odbcsql.html#615 `_ + + `SQL_DESC_TYPE`:idx: + `odbcsql.html#448 `_ + + `SQL_DESC_TYPE_NAME`:idx: + `odbcsql.html#614 `_ + + `SQL_DESC_UNNAMED`:idx: + `odbcsql.html#458 `_ + + `SQL_DESC_UNSIGNED`:idx: + `odbcsql.html#616 `_ + + `SQL_DESC_UPDATABLE`:idx: + `odbcsql.html#617 `_ + + `SQL_DIAG_ALTER_TABLE`:idx: + `odbcsql.html#473 `_ + + `SQL_DIAG_CLASS_ORIGIN`:idx: + `odbcsql.html#468 `_ + + `SQL_DIAG_CONNECTION_NAME`:idx: + `odbcsql.html#470 `_ + + `SQL_DIAG_CREATE_INDEX`:idx: + `odbcsql.html#474 `_ + + `SQL_DIAG_CREATE_TABLE`:idx: + `odbcsql.html#475 `_ + + `SQL_DIAG_CREATE_VIEW`:idx: + `odbcsql.html#476 `_ + + `SQL_DIAG_DELETE_WHERE`:idx: + `odbcsql.html#477 `_ + + `SQL_DIAG_DROP_INDEX`:idx: + `odbcsql.html#478 `_ + + `SQL_DIAG_DROP_TABLE`:idx: + `odbcsql.html#479 `_ + + `SQL_DIAG_DROP_VIEW`:idx: + `odbcsql.html#480 `_ + + `SQL_DIAG_DYNAMIC_DELETE_CURSOR`:idx: + `odbcsql.html#481 `_ + + `SQL_DIAG_DYNAMIC_FUNCTION`:idx: + `odbcsql.html#467 `_ + + `SQL_DIAG_DYNAMIC_FUNCTION_CODE`:idx: + `odbcsql.html#472 `_ + + `SQL_DIAG_DYNAMIC_UPDATE_CURSOR`:idx: + `odbcsql.html#482 `_ + + `SQL_DIAG_GRANT`:idx: + `odbcsql.html#483 `_ + + `SQL_DIAG_INSERT`:idx: + `odbcsql.html#484 `_ + + `SQL_DIAG_MESSAGE_TEXT`:idx: + `odbcsql.html#466 `_ + + `SQL_DIAG_NATIVE`:idx: + `odbcsql.html#465 `_ + + `SQL_DIAG_NUMBER`:idx: + `odbcsql.html#462 `_ + + `SQL_DIAG_RETURNCODE`:idx: + `odbcsql.html#461 `_ + + `SQL_DIAG_REVOKE`:idx: + `odbcsql.html#485 `_ + + `SQL_DIAG_ROW_COUNT`:idx: + `odbcsql.html#463 `_ + + `SQL_DIAG_SELECT_CURSOR`:idx: + `odbcsql.html#486 `_ + + `SQL_DIAG_SERVER_NAME`:idx: + `odbcsql.html#471 `_ + + `SQL_DIAG_SQLSTATE`:idx: + `odbcsql.html#464 `_ + + `SQL_DIAG_SUBCLASS_ORIGIN`:idx: + `odbcsql.html#469 `_ + + `SQL_DIAG_UNKNOWN_STATEMENT`:idx: + `odbcsql.html#487 `_ + + `SQL_DIAG_UPDATE_WHERE`:idx: + `odbcsql.html#488 `_ + + `SQLDisconnect`:idx: + `odbcsql.html#634 `_ + + `SQL_DOUBLE`:idx: + `odbcsql.html#143 `_ + + `SQL_DRIVER_COMPLETE`:idx: + `odbcsql.html#242 `_ + + `SQL_DRIVER_COMPLETE_REQUIRED`:idx: + `odbcsql.html#244 `_ + + `SQLDriverConnect`:idx: + `odbcsql.html#635 `_ + + `SQL_DRIVER_NOPROMPT`:idx: + `odbcsql.html#241 `_ + + `SQL_DRIVER_PROMPT`:idx: + `odbcsql.html#243 `_ + + `SQLDrivers`:idx: + `odbcsql.html#655 `_ + + `SQL_DROP`:idx: + `odbcsql.html#504 `_ + + `SQL_DYNAMIC_CURSOR_ATTRIBUTES1`:idx: + `odbcsql.html#271 `_ + + `SQL_DYNAMIC_CURSOR_ATTRIBUTES2`:idx: + `odbcsql.html#272 `_ + + `SQLEndTran`:idx: + `odbcsql.html#663 `_ + + `SQL_ENSURE`:idx: + `odbcsql.html#529 `_ + + `SQL_ERROR`:idx: + `odbcsql.html#357 `_ + + `SQLExecDirect`:idx: + `odbcsql.html#637 `_ + + `SQLExecute`:idx: + `odbcsql.html#640 `_ + + `SQLExtendedFetch`:idx: + `odbcsql.html#645 `_ + + `SQL_FALSE`:idx: + `odbcsql.html#498 `_ + + `SQLFetch`:idx: + `odbcsql.html#641 `_ + + `SQL_FETCH_ABSOLUTE`:idx: + `odbcsql.html#513 `_ + + `SQL_FETCH_BOOKMARK`:idx: + `odbcsql.html#250 `_ + + `SQL_FETCH_BY_BOOKMARK`:idx: + `odbcsql.html#321 `_ + + `SQL_FETCH_FIRST`:idx: + `odbcsql.html#508 `_ + + `SQL_FETCH_FIRST_SYSTEM`:idx: + `odbcsql.html#510 `_ + + `SQL_FETCH_FIRST_USER`:idx: + `odbcsql.html#509 `_ + + `SQL_FETCH_LAST`:idx: + `odbcsql.html#511 `_ + + `SQL_FETCH_NEXT`:idx: + `odbcsql.html#507 `_ + + `SQL_FETCH_PRIOR`:idx: + `odbcsql.html#512 `_ + + `SQL_FETCH_RELATIVE`:idx: + `odbcsql.html#514 `_ + + `SQLFetchScroll`:idx: + `odbcsql.html#644 `_ + + `SQL_FLOAT`:idx: + `odbcsql.html#141 `_ + + `SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1`:idx: + `odbcsql.html#273 `_ + + `SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2`:idx: + `odbcsql.html#274 `_ + + `SQLFreeHandle`:idx: + `odbcsql.html#630 `_ + + `SQLFreeStmt`:idx: + `odbcsql.html#661 `_ + + `SQL_GET_BOOKMARK`:idx: + `odbcsql.html#392 `_ + + `SQLGetCursorName`:idx: + `odbcsql.html#657 `_ + + `SQLGetData`:idx: + `odbcsql.html#646 `_ + + `SQLGetDiagField`:idx: + `odbcsql.html#632 `_ + + `SQLGetDiagRec`:idx: + `odbcsql.html#631 `_ + + `SQLGetEnvAttr`:idx: + `odbcsql.html#629 `_ + + `SQLGetInfo`:idx: + `odbcsql.html#649 `_ + + `SQLGetStmtAttr`:idx: + `odbcsql.html#648 `_ + + `SQL_GUID`:idx: + `odbcsql.html#153 `_ + + `SQL_HANDLE_DBC`:idx: + `odbcsql.html#367 `_ + + `SQL_HANDLE_DESC`:idx: + `odbcsql.html#369 `_ + + `SQL_HANDLE_ENV`:idx: + `odbcsql.html#366 `_ + + `SQL_HANDLE_STMT`:idx: + `odbcsql.html#368 `_ + + `SQL_INDEX_ALL`:idx: + `odbcsql.html#527 `_ + + `SQL_INDEX_CLUSTERED`:idx: + `odbcsql.html#531 `_ + + `SQL_INDEX_HASHED`:idx: + `odbcsql.html#532 `_ + + `SQL_INDEX_KEYWORDS`:idx: + `odbcsql.html#275 `_ + + `SQL_INDEX_OTHER`:idx: + `odbcsql.html#533 `_ + + `SQL_INDEX_UNIQUE`:idx: + `odbcsql.html#526 `_ + + `SQL_INFO_SCHEMA_VIEWS`:idx: + `odbcsql.html#276 `_ + + `SQL_INSENSITIVE`:idx: + `odbcsql.html#490 `_ + + `SQL_INTEGER`:idx: + `odbcsql.html#139 `_ + + `SQL_INTERVAL`:idx: + `odbcsql.html#152 `_ + + `SQL_INTERVAL_DAY`:idx: + `odbcsql.html#169 `_ + + `SQL_INTERVAL_DAY_TO_HOUR`:idx: + `odbcsql.html#174 `_ + + `SQL_INTERVAL_DAY_TO_MINUTE`:idx: + `odbcsql.html#175 `_ + + `SQL_INTERVAL_DAY_TO_SECOND`:idx: + `odbcsql.html#176 `_ + + `SQL_INTERVAL_HOUR`:idx: + `odbcsql.html#170 `_ + + `SQL_INTERVAL_HOUR_TO_MINUTE`:idx: + `odbcsql.html#177 `_ + + `SQL_INTERVAL_HOUR_TO_SECOND`:idx: + `odbcsql.html#178 `_ + + `SQL_INTERVAL_MINUTE`:idx: + `odbcsql.html#171 `_ + + `SQL_INTERVAL_MINUTE_TO_SECOND`:idx: + `odbcsql.html#179 `_ + + `SQL_INTERVAL_MONTH`:idx: + `odbcsql.html#168 `_ + + `SQL_INTERVAL_SECOND`:idx: + `odbcsql.html#172 `_ + + `SQL_INTERVAL_YEAR`:idx: + `odbcsql.html#167 `_ + + `SQL_INTERVAL_YEAR_TO_MONTH`:idx: + `odbcsql.html#173 `_ + + `SQL_INVALID_HANDLE`:idx: + `odbcsql.html#358 `_ + + `SQL_IS_INTEGER`:idx: + `odbcsql.html#247 `_ + + `SQL_IS_POINTER`:idx: + `odbcsql.html#245 `_ + + `SQL_IS_SMALLINT`:idx: + `odbcsql.html#249 `_ + + `SQL_IS_UINTEGER`:idx: + `odbcsql.html#246 `_ + + `SQL_IS_USMALLINT`:idx: + `odbcsql.html#248 `_ + + `SQL_KEYSET_CURSOR_ATTRIBUTES1`:idx: + `odbcsql.html#277 `_ + + `SQL_KEYSET_CURSOR_ATTRIBUTES2`:idx: + `odbcsql.html#278 `_ + + `SQL_KEYSET_SIZE`:idx: + `odbcsql.html#387 `_ + + `SQL_LOCK_EXCLUSIVE`:idx: + `odbcsql.html#327 `_ + + `SQL_LOCK_NO_CHANGE`:idx: + `odbcsql.html#326 `_ + + `SQL_LOCK_UNLOCK`:idx: + `odbcsql.html#328 `_ + + `SQL_LOGIN_TIMEOUT`:idx: + `odbcsql.html#407 `_ + + `SQL_LONGVARBINARY`:idx: + `odbcsql.html#129 `_ + + `SQL_LONGVARCHAR`:idx: + `odbcsql.html#126 `_ + + `SQL_MAX_DSN_LENGTH`:idx: + `odbcsql.html#338 `_ + + `SQL_MAX_IDENTIFIER_LEN`:idx: + `odbcsql.html#547 `_ + + `SQL_MAXIMUM_IDENTIFIER_LENGTH`:idx: + `odbcsql.html#548 `_ + + `SQL_MAX_LENGTH`:idx: + `odbcsql.html#382 `_ + + `SQL_MAX_MESSAGE_LENGTH`:idx: + `odbcsql.html#362 `_ + + `SQL_MAX_OPTION_STRING_LENGTH`:idx: + `odbcsql.html#339 `_ + + `SQL_MAX_ROWS`:idx: + `odbcsql.html#380 `_ + + `SQL_MODE_DEFAULT`:idx: + `odbcsql.html#431 `_ + + `SQL_MODE_READ_ONLY`:idx: + `odbcsql.html#430 `_ + + `SQL_MODE_READ_WRITE`:idx: + `odbcsql.html#429 `_ + + `SQL_NAME_LEN`:idx: + `odbcsql.html#237 `_ + + `SQL_NEED_DATA`:idx: + `odbcsql.html#360 `_ + + `SQL_NO_DATA`:idx: + `odbcsql.html#356 `_ + + `SQL_NONSCROLLABLE`:idx: + `odbcsql.html#435 `_ + + `SQL_NO_NULLS`:idx: + `odbcsql.html#500 `_ + + `SQL_NOSCAN`:idx: + `odbcsql.html#381 `_ + + `SQL_NO_TOTAL`:idx: + `odbcsql.html#230 `_ + + `SQL_NTS`:idx: + `odbcsql.html#361 `_ + + `SQL_NULLABLE`:idx: + `odbcsql.html#501 `_ + + `SQL_NULLABLE_UNKNOWN`:idx: + `odbcsql.html#502 `_ + + `SQL_NULL_DATA`:idx: + `odbcsql.html#352 `_ + + `SQL_NULL_HANDLE`:idx: + `odbcsql.html#519 `_ + + `SQL_NULL_HDBC`:idx: + `odbcsql.html#516 `_ + + `SQL_NULL_HDESC`:idx: + `odbcsql.html#518 `_ + + `SQL_NULL_HENV`:idx: + `odbcsql.html#515 `_ + + `SQL_NULL_HSTMT`:idx: + `odbcsql.html#517 `_ + + `SQL_NUMERIC`:idx: + `odbcsql.html#137 `_ + + `SQLNumResultCols`:idx: + `odbcsql.html#642 `_ + + `SQL_ODBC_CURSORS`:idx: + `odbcsql.html#340 `_ + + `SQL_OJ_CAPABILITIES`:idx: + `odbcsql.html#540 `_ + + `SQL_OPT_TRACE`:idx: + `odbcsql.html#408 `_ + + `SQL_OPT_TRACEFILE`:idx: + `odbcsql.html#409 `_ + + `SQL_OUTER_JOIN_CAPABILITIES`:idx: + `odbcsql.html#541 `_ + + `SQL_OV_ODBC2`:idx: + `odbcsql.html#239 `_ + + `SQL_OV_ODBC3`:idx: + `odbcsql.html#238 `_ + + `SQL_PACKET_SIZE`:idx: + `odbcsql.html#414 `_ + + `SQL_PARAM_INPUT`:idx: + `odbcsql.html#347 `_ + + `SQL_PARAM_INPUT_OUTPUT`:idx: + `odbcsql.html#348 `_ + + `SQL_PARAM_OUTPUT`:idx: + `odbcsql.html#350 `_ + + `SQL_PARAM_TYPE_UNKNOWN`:idx: + `odbcsql.html#346 `_ + + `SQL_POSITION`:idx: + `odbcsql.html#322 `_ + + `SQLPrepare`:idx: + `odbcsql.html#638 `_ + + `SQLPrimaryKeys`:idx: + `odbcsql.html#668 `_ + + `SQLProcedureColumns`:idx: + `odbcsql.html#669 `_ + + `SQLProcedures`:idx: + `odbcsql.html#667 `_ + + `SQLPutData`:idx: + `odbcsql.html#651 `_ + + `SQL_QUERY_TIMEOUT`:idx: + `odbcsql.html#379 `_ + + `SQL_QUICK`:idx: + `odbcsql.html#528 `_ + + `SQL_QUIET_MODE`:idx: + `odbcsql.html#413 `_ + + `SQL_REAL`:idx: + `odbcsql.html#142 `_ + + `SQL_REFRESH`:idx: + `odbcsql.html#323 `_ + + `SQL_RESET_PARAMS`:idx: + `odbcsql.html#506 `_ + + `SQL_RESULT_COL`:idx: + `odbcsql.html#349 `_ + + `SQL_RETRIEVE_DATA`:idx: + `odbcsql.html#390 `_ + + `SQL_RETURN_VALUE`:idx: + `odbcsql.html#351 `_ + + `SQL_ROLLBACK`:idx: + `odbcsql.html#619 `_ + + `SQL_ROW_ADDED`:idx: + `odbcsql.html#333 `_ + + `SQLRowCount`:idx: + `odbcsql.html#659 `_ + + `SQL_ROW_DELETED`:idx: + `odbcsql.html#330 `_ + + `SQL_ROW_ERROR`:idx: + `odbcsql.html#334 `_ + + `SQL_ROW_IDENTIFIER`:idx: + `odbcsql.html#525 `_ + + `SQL_ROW_IGNORE`:idx: + `odbcsql.html#337 `_ + + `SQL_ROW_NOROW`:idx: + `odbcsql.html#332 `_ + + `SQL_ROW_NUMBER`:idx: + `odbcsql.html#393 `_ + + `SQL_ROW_PROCEED`:idx: + `odbcsql.html#336 `_ + + `SQL_ROWSET_SIZE`:idx: + `odbcsql.html#388 `_ + + `SQL_ROW_SUCCESS`:idx: + `odbcsql.html#329 `_ + + `SQL_ROW_SUCCESS_WITH_INFO`:idx: + `odbcsql.html#335 `_ + + `SQL_ROW_UPDATED`:idx: + `odbcsql.html#331 `_ + + `SQL_ROWVER`:idx: + `odbcsql.html#524 `_ + + `SQL_SCCO_LOCK`:idx: + `odbcsql.html#550 `_ + + `SQL_SCCO_OPT_ROWVER`:idx: + `odbcsql.html#551 `_ + + `SQL_SCCO_OPT_VALUES`:idx: + `odbcsql.html#552 `_ + + `SQL_SCCO_READ_ONLY`:idx: + `odbcsql.html#549 `_ + + `SQL_SCOPE_CURROW`:idx: + `odbcsql.html#520 `_ + + `SQL_SCOPE_SESSION`:idx: + `odbcsql.html#522 `_ + + `SQL_SCOPE_TRANSACTION`:idx: + `odbcsql.html#521 `_ + + `SQL_SCROLLABLE`:idx: + `odbcsql.html#436 `_ + + `SQL_SCROLL_CONCURRENCY`:idx: + `odbcsql.html#534 `_ + + `SQL_SCROLL_OPTIONS`:idx: + `odbcsql.html#251 `_ + + `SQL_SENSITIVE`:idx: + `odbcsql.html#491 `_ + + `SQLSetConnectAttr`:idx: + `odbcsql.html#656 `_ + + `SQLSetCursorName`:idx: + `odbcsql.html#658 `_ + + `SQLSetEnvAttr`:idx: + `odbcsql.html#628 `_ + + `SQLSetPos`:idx: + `odbcsql.html#653 `_ + + `SQL_SETPOS_MAX_OPTION_VALUE`:idx: + `odbcsql.html#318 `_ + + `SQLSetStmtAttr`:idx: + `odbcsql.html#647 `_ + + `SQL_SIGNED_OFFSET`:idx: + `odbcsql.html#191 `_ + + `SQL_SIMULATE_CURSOR`:idx: + `odbcsql.html#389 `_ + + `SQL_SMALLINT`:idx: + `odbcsql.html#140 `_ + + `SQL_SO_DYNAMIC`:idx: + `odbcsql.html#259 `_ + + `SQL_SO_FORWARD_ONLY`:idx: + `odbcsql.html#257 `_ + + `SQL_SO_KEYSET_DRIVEN`:idx: + `odbcsql.html#258 `_ + + `SQL_SO_MIXED`:idx: + `odbcsql.html#260 `_ + + `SQL_SO_STATIC`:idx: + `odbcsql.html#261 `_ + + `SQLSpecialColumns`:idx: + `odbcsql.html#666 `_ + + `SQL_SS_ADDITIONS`:idx: + `odbcsql.html#566 `_ + + `SQL_SS_DELETIONS`:idx: + `odbcsql.html#567 `_ + + `SQL_SS_UPDATES`:idx: + `odbcsql.html#568 `_ + + `SQL_STATIC_CURSOR_ATTRIBUTES1`:idx: + `odbcsql.html#279 `_ + + `SQL_STATIC_CURSOR_ATTRIBUTES2`:idx: + `odbcsql.html#280 `_ + + `SQL_STATIC_SENSITIVITY`:idx: + `odbcsql.html#263 `_ + + `SQLStatistics`:idx: + `odbcsql.html#670 `_ + + `SQL_STILL_EXECUTING`:idx: + `odbcsql.html#359 `_ + + `SQL_SUCCESS`:idx: + `odbcsql.html#354 `_ + + `SQL_SUCCESS_WITH_INFO`:idx: + `odbcsql.html#355 `_ + + `SQLTables`:idx: + `odbcsql.html#664 `_ + + `SQL_TABLE_STAT`:idx: + `odbcsql.html#530 `_ + + `SQL_TC_ALL`:idx: + `odbcsql.html#555 `_ + + `SQL_TC_DDL_COMMIT`:idx: + `odbcsql.html#556 `_ + + `SQL_TC_DDL_IGNORE`:idx: + `odbcsql.html#557 `_ + + `SQL_TC_DML`:idx: + `odbcsql.html#554 `_ + + `SQL_TC_NONE`:idx: + `odbcsql.html#553 `_ + + `SQL_TIME`:idx: + `odbcsql.html#150 `_ + + `SQL_TIME_LEN`:idx: + `odbcsql.html#364 `_ + + `SQL_TIMESTAMP`:idx: + `odbcsql.html#151 `_ + + `SQL_TIMESTAMP_LEN`:idx: + `odbcsql.html#365 `_ + + `SQL_TIMESTAMP_STRUCT`:idx: + `odbcsql.html#235 `_ + + `SQL_TIME_STRUCT`:idx: + `odbcsql.html#233 `_ + + `SQL_TINYINT`:idx: + `odbcsql.html#131 `_ + + `SQL_TRANSACTION_CAPABLE`:idx: + `odbcsql.html#536 `_ + + `SQL_TRANSACTION_ISOLATION_OPTION`:idx: + `odbcsql.html#539 `_ + + `SQL_TRANSACTION_READ_COMMITTED`:idx: + `odbcsql.html#561 `_ + + `SQL_TRANSACTION_READ_UNCOMMITTED`:idx: + `odbcsql.html#559 `_ + + `SQL_TRANSACTION_REPEATABLE_READ`:idx: + `odbcsql.html#563 `_ + + `SQL_TRANSACTION_SERIALIZABLE`:idx: + `odbcsql.html#565 `_ + + `SQL_TRANSLATE_DLL`:idx: + `odbcsql.html#410 `_ + + `SQL_TRANSLATE_OPTION`:idx: + `odbcsql.html#411 `_ + + `SQL_TRUE`:idx: + `odbcsql.html#499 `_ + + `SQL_TXN_CAPABLE`:idx: + `odbcsql.html#535 `_ + + `SQL_TXN_ISOLATION`:idx: + `odbcsql.html#402 `_ + + `SQL_TXN_ISOLATION_OPTION`:idx: + `odbcsql.html#538 `_ + + `SQL_TXN_READ_COMMITTED`:idx: + `odbcsql.html#560 `_ + + `SQL_TXN_READ_UNCOMMITTED`:idx: + `odbcsql.html#558 `_ + + `SQL_TXN_REPEATABLE_READ`:idx: + `odbcsql.html#562 `_ + + `SQL_TXN_SERIALIZABLE`:idx: + `odbcsql.html#564 `_ + + `SQL_TYPE_DATE`:idx: + `odbcsql.html#146 `_ + + `SQL_TYPE_MAX`:idx: + `odbcsql.html#227 `_ + + `SQL_TYPE_MIN`:idx: + `odbcsql.html#226 `_ + + `SQL_TYPE_NULL`:idx: + `odbcsql.html#225 `_ + + `SQL_TYPE_TIME`:idx: + `odbcsql.html#147 `_ + + `SQL_TYPE_TIMESTAMP`:idx: + `odbcsql.html#148 `_ + + `SQL_UB_DEFAULT`:idx: + `odbcsql.html#254 `_ + + `SQL_UB_FIXED`:idx: + `odbcsql.html#255 `_ + + `SQL_UB_OFF`:idx: + `odbcsql.html#252 `_ + + `SQL_UB_ON`:idx: + `odbcsql.html#253 `_ + + `SQL_UB_VARIABLE`:idx: + `odbcsql.html#256 `_ + + `SQL_UNBIND`:idx: + `odbcsql.html#505 `_ + + `SQL_UNICODE`:idx: + `odbcsql.html#180 `_ + + `SQL_UNICODE_CHAR`:idx: + `odbcsql.html#183 `_ + + `SQL_UNICODE_LONGVARCHAR`:idx: + `odbcsql.html#182 `_ + + `SQL_UNICODE_VARCHAR`:idx: + `odbcsql.html#181 `_ + + `SQL_UNKNOWN_TYPE`:idx: + `odbcsql.html#125 `_ + + `SQL_UNSIGNED_OFFSET`:idx: + `odbcsql.html#192 `_ + + `SQL_UNSPECIFIED`:idx: + `odbcsql.html#489 `_ + + `SQL_UPDATE`:idx: + `odbcsql.html#324 `_ + + `SQL_UPDATE_BY_BOOKMARK`:idx: + `odbcsql.html#319 `_ + + `SQL_USE_BOOKMARKS`:idx: + `odbcsql.html#391 `_ + + `SQL_USER_NAME`:idx: + `odbcsql.html#537 `_ + + `SQL_VARBINARY`:idx: + `odbcsql.html#128 `_ + + `SQL_VARCHAR`:idx: + `odbcsql.html#145 `_ + + `SQL_WCHAR`:idx: + `odbcsql.html#133 `_ + + `SQL_WLONGVARCHAR`:idx: + `odbcsql.html#135 `_ + + `SQL_WVARCHAR`:idx: + `odbcsql.html#134 `_ + + `SQL_XOPEN_CLI_YEAR`:idx: + `odbcsql.html#542 `_ + + `sqrt`:idx: + * `math.html#110 `_ + * `complex.html#109 `_ + + `SS_DISABLE`:idx: + `posix.html#765 `_ + + `SS_ONSTACK`:idx: + `posix.html#764 `_ + + `stack_trace`:idx: + `nimrodc.html#108 `_ + + `startsWith`:idx: + `strutils.html#137 `_ + + `stat`:idx: + `posix.html#1065 `_ + + `statement macros`:idx: + `tut2.html#114 `_ + + `Statements`:idx: + `manual.html#173 `_ + + `static error`:idx: + `manual.html#109 `_ + + `static type`:idx: + `manual.html#103 `_ + + `statvfs`:idx: + `posix.html#1056 `_ + + `stdcall`:idx: + `manual.html#164 `_ + + `stderr`:idx: + `system.html#485 `_ + + `STDERR_FILENO`:idx: + `posix.html#127 `_ + + `stdin`:idx: + `system.html#483 `_ + + `STDIN_FILENO`:idx: + `posix.html#128 `_ + + `stdout`:idx: + `system.html#484 `_ + + `STDOUT_FILENO`:idx: + `posix.html#129 `_ + + `ST_NOSUID`:idx: + `posix.html#673 `_ + + `ST_RDONLY`:idx: + `posix.html#672 `_ + + `strerror`:idx: + `posix.html#1160 `_ + + `strfmon`:idx: + `posix.html#848 `_ + + `strftime`:idx: + `posix.html#1110 `_ + + `string`:idx: + * `manual.html#150 `_ + * `system.html#111 `_ + + `strip`:idx: + `strutils.html#105 `_ + + `strptime`:idx: + `posix.html#1111 `_ + + `strStart`:idx: + `strutils.html#103 `_ + + `structured type`:idx: + `manual.html#151 `_ + + `strutils`:idx: + `nimrodc.html#117 `_ + + `style-insensitive`:idx: + `manual.html#118 `_ + + `S_TYPEISMQ`:idx: + `posix.html#1074 `_ + + `S_TYPEISSEM`:idx: + `posix.html#1075 `_ + + `S_TYPEISSHM`:idx: + `posix.html#1076 `_ + + `S_TYPEISTMO`:idx: + `posix.html#1077 `_ + + `subrange`:idx: + * `manual.html#149 `_ + * `tut1.html#115 `_ + + `succ`:idx: + `system.html#157 `_ + + `swab`:idx: + `posix.html#1031 `_ + + `swap`:idx: + `system.html#419 `_ + + `swapcontext`:idx: + `posix.html#1191 `_ + + `symlink`:idx: + `posix.html#1032 `_ + + `sync`:idx: + `posix.html#1033 `_ + + `syscall`:idx: + `manual.html#171 `_ + + `sysconf`:idx: + `posix.html#1034 `_ + + `system`:idx: + `manual.html#218 `_ + + `tabulator`:idx: + `manual.html#125 `_ + + `TAddress`:idx: + `system.html#372 `_ + + `Taiocb`:idx: + `posix.html#204 `_ + + `TAllocfunc`:idx: + `zlib.html#108 `_ + + `tan`:idx: + `math.html#125 `_ + + `tanh`:idx: + `math.html#126 `_ + + `TBaseLexer`:idx: + `lexbase.html#103 `_ + + `Tblkcnt`:idx: + `posix.html#143 `_ + + `Tblksize`:idx: + `posix.html#144 `_ + + `TCfgEvent`:idx: + `parsecfg.html#102 `_ + + `TCfgEventKind`:idx: + `parsecfg.html#101 `_ + + `TCfgParser`:idx: + `parsecfg.html#103 `_ + + `tcgetpgrp`:idx: + `posix.html#1035 `_ + + `TCharSet`:idx: + `strutils.html#101 `_ + + `TClock`:idx: + `posix.html#145 `_ + + `TClockId`:idx: + `posix.html#146 `_ + + `TCmdLineKind`:idx: + `parseopt.html#101 `_ + + `TComplex`:idx: + `complex.html#101 `_ + + `tcsetpgrp`:idx: + `posix.html#1036 `_ + + `TDev`:idx: + `posix.html#147 `_ + + `TDIR`:idx: + `posix.html#130 `_ + + `Tdirent`:idx: + `posix.html#131 `_ + + `telldir`:idx: + `posix.html#806 `_ + + `template`:idx: + `manual.html#209 `_ + + `TEndian`:idx: + `system.html#385 `_ + + `Tfd_set`:idx: + `posix.html#201 `_ + + `Tfenv`:idx: + `posix.html#133 `_ + + `Tfexcept`:idx: + `posix.html#134 `_ + + `TFile`:idx: + `system.html#480 `_ + + `TFileHandle`:idx: + `system.html#482 `_ + + `TFileMode`:idx: + `system.html#481 `_ + + `TFileStream`:idx: + `streams.html#119 `_ + + `TFloatClass`:idx: + `math.html#103 `_ + + `Tflock`:idx: + `posix.html#132 `_ + + `T_FMT`:idx: + `posix.html#392 `_ + + `T_FMT_AMPM`:idx: + `posix.html#393 `_ + + `TFormatFlag`:idx: + `strtabs.html#111 `_ + + `TFreeFunc`:idx: + `zlib.html#109 `_ + + `Tfsblkcnt`:idx: + `posix.html#148 `_ + + `Tfsfilcnt`:idx: + `posix.html#149 `_ + + `TFTW`:idx: + `posix.html#135 `_ + + `TGC_Strategy`:idx: + `system.html#463 `_ + + `TGid`:idx: + `posix.html#150 `_ + + `TGlob`:idx: + `posix.html#136 `_ + + `TGroup`:idx: + `posix.html#137 `_ + + `THash`:idx: + `hashes.html#101 `_ + + `THOUSEP`:idx: + `posix.html#440 `_ + + `Ticonv`:idx: + `posix.html#138 `_ + + `Tid`:idx: + `posix.html#151 `_ + + `time`:idx: + `posix.html#1112 `_ + + `TimeInfoToTime`:idx: + `times.html#108 `_ + + `TIMER_ABSTIME`:idx: + `posix.html#699 `_ + + `timer_create`:idx: + `posix.html#1113 `_ + + `timer_delete`:idx: + `posix.html#1114 `_ + + `timer_getoverrun`:idx: + `posix.html#1116 `_ + + `timer_gettime`:idx: + `posix.html#1115 `_ + + `timer_settime`:idx: + `posix.html#1117 `_ + + `times`:idx: + `nimrodc.html#119 `_ + + `timezone`:idx: + `posix.html#702 `_ + + `Tino`:idx: + `posix.html#152 `_ + + `TInternalState`:idx: + `zlib.html#110 `_ + + `Tipc_perm`:idx: + `posix.html#182 `_ + + `titimerspec`:idx: + `posix.html#188 `_ + + `TKey`:idx: + `posix.html#153 `_ + + `Tlconv`:idx: + `posix.html#139 `_ + + `Tmcontext`:idx: + `posix.html#202 `_ + + `TMode`:idx: + `posix.html#154 `_ + + `TMonth`:idx: + `times.html#101 `_ + + `TMqAttr`:idx: + `posix.html#141 `_ + + `TMqd`:idx: + `posix.html#140 `_ + + `Tnl_catd`:idx: + `posix.html#198 `_ + + `TNlink`:idx: + `posix.html#155 `_ + + `Tnl_item`:idx: + `posix.html#197 `_ + + `toBiggestFloat`:idx: + `system.html#401 `_ + + `toBiggestInt`:idx: + `system.html#403 `_ + + `toBin`:idx: + `strutils.html#142 `_ + + `TObject`:idx: + `system.html#131 `_ + + `TOff`:idx: + `posix.html#156 `_ + + `toFloat`:idx: + `system.html#400 `_ + + `toHex`:idx: + `strutils.html#128 `_ + + `toInt`:idx: + `system.html#402 `_ + + `toLower`:idx: + * `strutils.html#106 `_ + * `strutils.html#107 `_ + + `toOct`:idx: + `strutils.html#141 `_ + + `toOctal`:idx: + `strutils.html#118 `_ + + `TOptParser`:idx: + `parseopt.html#102 `_ + + `toString`:idx: + `strutils.html#133 `_ + + `toU16`:idx: + `system.html#179 `_ + + `toU32`:idx: + `system.html#180 `_ + + `toU8`:idx: + `system.html#178 `_ + + `toUpper`:idx: + * `strutils.html#108 `_ + * `strutils.html#109 `_ + + `TPasswd`:idx: + `posix.html#142 `_ + + `TPathComponent`:idx: + `os.html#152 `_ + + `TPid`:idx: + `posix.html#157 `_ + + `Tposix_spawnattr`:idx: + `posix.html#205 `_ + + `Tposix_spawn_file_actions`:idx: + `posix.html#206 `_ + + `Tposix_typed_mem_info`:idx: + `posix.html#185 `_ + + `Tpthread`:idx: + `posix.html#170 `_ + + `Tpthread_attr`:idx: + `posix.html#158 `_ + + `Tpthread_barrier`:idx: + `posix.html#159 `_ + + `Tpthread_barrierattr`:idx: + `posix.html#160 `_ + + `Tpthread_cond`:idx: + `posix.html#161 `_ + + `Tpthread_condattr`:idx: + `posix.html#162 `_ + + `Tpthread_key`:idx: + `posix.html#163 `_ + + `Tpthread_mutex`:idx: + `posix.html#164 `_ + + `Tpthread_mutexattr`:idx: + `posix.html#165 `_ + + `Tpthread_once`:idx: + `posix.html#166 `_ + + `Tpthread_rwlock`:idx: + `posix.html#167 `_ + + `Tpthread_rwlockattr`:idx: + `posix.html#168 `_ + + `Tpthread_spinlock`:idx: + `posix.html#169 `_ + + `traced`:idx: + * `manual.html#159 `_ + * `tut1.html#121 `_ + + `TResult`:idx: + `system.html#155 `_ + + `truncate`:idx: + `posix.html#1037 `_ + + `try`:idx: + * `manual.html#185 `_ + * `tut2.html#108 `_ + + `Tsched_param`:idx: + `posix.html#199 `_ + + `TSem`:idx: + `posix.html#181 `_ + + `TSigaction`:idx: + `posix.html#193 `_ + + `Tsig_atomic`:idx: + `posix.html#189 `_ + + `TsigEvent`:idx: + `posix.html#191 `_ + + `TsigInfo`:idx: + `posix.html#196 `_ + + `Tsigset`:idx: + `posix.html#190 `_ + + `TSigStack`:idx: + `posix.html#195 `_ + + `TsigVal`:idx: + `posix.html#192 `_ + + `TSqlChar`:idx: + `odbcsql.html#101 `_ + + `TSqlDouble`:idx: + `odbcsql.html#113 `_ + + `TSqlFloat`:idx: + `odbcsql.html#114 `_ + + `TSqlHandle`:idx: + `odbcsql.html#104 `_ + + `TSqlHDBC`:idx: + `odbcsql.html#106 `_ + + `TSqlHDesc`:idx: + `odbcsql.html#108 `_ + + `TSqlHEnv`:idx: + `odbcsql.html#105 `_ + + `TSqlHStmt`:idx: + `odbcsql.html#107 `_ + + `TSqlHWND`:idx: + `odbcsql.html#115 `_ + + `TSqlInteger`:idx: + `odbcsql.html#109 `_ + + `TSqlPointer`:idx: + `odbcsql.html#111 `_ + + `TSqlReal`:idx: + `odbcsql.html#112 `_ + + `TSqlSmallInt`:idx: + `odbcsql.html#102 `_ + + `TSqlUInteger`:idx: + `odbcsql.html#110 `_ + + `TSqlUSmallInt`:idx: + `odbcsql.html#103 `_ + + `TStack`:idx: + `posix.html#194 `_ + + `TStat`:idx: + `posix.html#183 `_ + + `TStatvfs`:idx: + `posix.html#184 `_ + + `TStream`:idx: + `streams.html#102 `_ + + `TStringStream`:idx: + `streams.html#116 `_ + + `TStringTable`:idx: + `strtabs.html#102 `_ + + `TStringTableMode`:idx: + `strtabs.html#101 `_ + + `Tsuseconds`:idx: + `posix.html#171 `_ + + `Ttime`:idx: + `posix.html#172 `_ + + `TTime`:idx: + `times.html#103 `_ + + `TTimeInfo`:idx: + `times.html#104 `_ + + `Ttimer`:idx: + `posix.html#173 `_ + + `Ttimespec`:idx: + `posix.html#187 `_ + + `Ttimeval`:idx: + `posix.html#200 `_ + + `Ttm`:idx: + `posix.html#186 `_ + + `Ttrace_attr`:idx: + `posix.html#174 `_ + + `Ttrace_event_id`:idx: + `posix.html#175 `_ + + `Ttrace_event_set`:idx: + `posix.html#176 `_ + + `Ttrace_id`:idx: + `posix.html#177 `_ + + `ttyname`:idx: + `posix.html#1038 `_ + + `ttyname_r`:idx: + `posix.html#1039 `_ + + `Tucontext`:idx: + `posix.html#203 `_ + + `Tuid`:idx: + `posix.html#178 `_ + + `tuple`:idx: + `manual.html#154 `_ + + `Tuseconds`:idx: + `posix.html#179 `_ + + `Tutsname`:idx: + `posix.html#180 `_ + + `TWeekDay`:idx: + `times.html#102 `_ + + `type`:idx: + * `manual.html#102 `_ + * `manual.html#140 `_ + * `manual.html#206 `_ + + `type casts`:idx: + `tut2.html#101 `_ + + `type conversions`:idx: + `tut2.html#102 `_ + + `type parameters`:idx: + * `manual.html#208 `_ + * `tut2.html#110 `_ + + `type suffix`:idx: + `manual.html#137 `_ + + `TZipArchive`:idx: + `zipfiles.html#101 `_ + + `Tzip_source_callback`:idx: + `libzip.html#102 `_ + + `Tzip_source_cmd`:idx: + `libzip.html#101 `_ + + `Tzip_stat`:idx: + `libzip.html#104 `_ + + `tzset`:idx: + `posix.html#1118 `_ + + `TZStream`:idx: + `zlib.html#112 `_ + + `TZStreamRec`:idx: + `zlib.html#113 `_ + + `ualarm`:idx: + `posix.html#1040 `_ + + `Uint`:idx: + `zlib.html#101 `_ + + `Ulong`:idx: + `zlib.html#102 `_ + + `Ulongf`:idx: + `zlib.html#103 `_ + + `umask`:idx: + `posix.html#1066 `_ + + `uname`:idx: + `posix.html#866 `_ + + `unchecked runtime error`:idx: + `manual.html#111 `_ + + `uncompress`:idx: + `zlib.html#156 `_ + + `undef`:idx: + `manual.html#223 `_ + + `UnixToNativePath`:idx: + `os.html#124 `_ + + `unlink`:idx: + `posix.html#1041 `_ + + `unsigned integer`:idx: + * `manual.html#142 `_ + * `tut1.html#108 `_ + + `unsigned operations`:idx: + * `manual.html#143 `_ + * `tut1.html#109 `_ + + `untraced`:idx: + * `manual.html#160 `_ + * `tut1.html#122 `_ + + `usleep`:idx: + `posix.html#1042 `_ + + `Var`:idx: + `manual.html#178 `_ + + `varargs`:idx: + `nimrodc.html#106 `_ + + `variant`:idx: + * `manual.html#156 `_ + * `tut2.html#103 `_ + + `vertical tabulator`:idx: + `manual.html#126 `_ + + `vfork`:idx: + `posix.html#1043 `_ + + `volatile`:idx: + `nimrodc.html#111 `_ + + `wait`:idx: + `posix.html#1119 `_ + + `waitid`:idx: + `posix.html#1120 `_ + + `waitpid`:idx: + `posix.html#1121 `_ + + `walkDir`:idx: + `os.html#153 `_ + + `walkFiles`:idx: + * `os.html#151 `_ + * `zipfiles.html#110 `_ + + `warning`:idx: + * `dialogs.html#103 `_ + * `manual.html#220 `_ + * `manual.html#226 `_ + + `WCONTINUED`:idx: + `posix.html#714 `_ + + `WEXITED`:idx: + `posix.html#712 `_ + + `WEXITSTATUS`:idx: + `posix.html#705 `_ + + `when`:idx: + * `manual.html#182 `_ + * `tut1.html#106 `_ + + `while`:idx: + `manual.html#194 `_ + + `Whitespace`:idx: + `strutils.html#102 `_ + + `WIFCONTINUED`:idx: + `posix.html#706 `_ + + `WIFEXITED`:idx: + `posix.html#707 `_ + + `WIFSIGNALED`:idx: + `posix.html#708 `_ + + `WIFSTOPPED`:idx: + `posix.html#709 `_ + + `WNOHANG`:idx: + `posix.html#703 `_ + + `WNOWAIT`:idx: + `posix.html#715 `_ + + `W_OK`:idx: + `posix.html#480 `_ + + `write`:idx: + * `posix.html#1044 `_ + * `system.html#493 `_ + * `system.html#494 `_ + * `system.html#495 `_ + * `system.html#496 `_ + * `system.html#497 `_ + * `system.html#498 `_ + * `system.html#499 `_ + * `streams.html#103 `_ + * `streams.html#104 `_ + + `writeBuffer`:idx: + `system.html#509 `_ + + `writeBytes`:idx: + `system.html#507 `_ + + `writeChars`:idx: + `system.html#508 `_ + + `writeln`:idx: + * `system.html#501 `_ + * `system.html#502 `_ + + `WSTOPPED`:idx: + `posix.html#713 `_ + + `WSTOPSIG`:idx: + `posix.html#710 `_ + + `WTERMSIG`:idx: + `posix.html#711 `_ + + `WUNTRACED`:idx: + `posix.html#704 `_ + + `X_OK`:idx: + `posix.html#481 `_ + + `xor`:idx: + * `system.html#118 `_ + * `system.html#241 `_ + * `system.html#242 `_ + * `system.html#243 `_ + * `system.html#244 `_ + * `system.html#245 `_ + + `YESEXPR`:idx: + `posix.html#441 `_ + + `yield`:idx: + `manual.html#191 `_ + + `Z_ASCII`:idx: + `zlib.html#138 `_ + + `Z_BEST_COMPRESSION`:idx: + `zlib.html#132 `_ + + `Z_BEST_SPEED`:idx: + `zlib.html#131 `_ + + `Z_BINARY`:idx: + `zlib.html#137 `_ + + `Z_BUF_ERROR`:idx: + `zlib.html#128 `_ + + `Z_DATA_ERROR`:idx: + `zlib.html#126 `_ + + `Z_DEFAULT_COMPRESSION`:idx: + `zlib.html#133 `_ + + `Z_DEFAULT_STRATEGY`:idx: + `zlib.html#136 `_ + + `Z_DEFLATED`:idx: + `zlib.html#140 `_ + + `ze`:idx: + * `system.html#172 `_ + * `system.html#173 `_ + + `ze64`:idx: + * `system.html#174 `_ + * `system.html#175 `_ + * `system.html#176 `_ + * `system.html#177 `_ + + `zeroMem`:idx: + `system.html#409 `_ + + `Z_ERRNO`:idx: + `zlib.html#124 `_ + + `zError`:idx: + `zlib.html#184 `_ + + `Z_FILTERED`:idx: + `zlib.html#134 `_ + + `Z_FINISH`:idx: + `zlib.html#120 `_ + + `Z_FULL_FLUSH`:idx: + `zlib.html#119 `_ + + `Z_HUFFMAN_ONLY`:idx: + `zlib.html#135 `_ + + `zip_add`:idx: + `libzip.html#170 `_ + + `zip_add_dir`:idx: + `libzip.html#171 `_ + + `ZIP_AFL_TORRENT`:idx: + `libzip.html#116 `_ + + `ZIP_CHECKCONS`:idx: + `libzip.html#110 `_ + + `zip_close`:idx: + `libzip.html#172 `_ + + `ZIP_CM_BZIP2`:idx: + `libzip.html#155 `_ + + `ZIP_CM_DEFAULT`:idx: + `libzip.html#144 `_ + + `ZIP_CM_DEFLATE`:idx: + `libzip.html#152 `_ + + `ZIP_CM_DEFLATE64`:idx: + `libzip.html#153 `_ + + `ZIP_CM_IMPLODE`:idx: + `libzip.html#151 `_ + + `ZIP_CM_LZ77`:idx: + `libzip.html#158 `_ + + `ZIP_CM_LZMA`:idx: + `libzip.html#156 `_ + + `ZIP_CM_PKWARE_IMPLODE`:idx: + `libzip.html#154 `_ + + `ZIP_CM_PPMD`:idx: + `libzip.html#160 `_ + + `ZIP_CM_REDUCE_1`:idx: + `libzip.html#147 `_ + + `ZIP_CM_REDUCE_2`:idx: + `libzip.html#148 `_ + + `ZIP_CM_REDUCE_3`:idx: + `libzip.html#149 `_ + + `ZIP_CM_REDUCE_4`:idx: + `libzip.html#150 `_ + + `ZIP_CM_SHRINK`:idx: + `libzip.html#146 `_ + + `ZIP_CM_STORE`:idx: + `libzip.html#145 `_ + + `ZIP_CM_TERSE`:idx: + `libzip.html#157 `_ + + `ZIP_CM_WAVPACK`:idx: + `libzip.html#159 `_ + + `ZIP_CREATE`:idx: + `libzip.html#108 `_ + + `zip_delete`:idx: + `libzip.html#173 `_ + + `ZIP_EM_NONE`:idx: + `libzip.html#161 `_ + + `ZIP_EM_TRAD_PKWARE`:idx: + `libzip.html#162 `_ + + `ZIP_EM_UNKNOWN`:idx: + `libzip.html#163 `_ + + `ZIP_ER_CHANGED`:idx: + `libzip.html#132 `_ + + `ZIP_ER_CLOSE`:idx: + `libzip.html#120 `_ + + `ZIP_ER_COMPNOTSUPP`:idx: + `libzip.html#133 `_ + + `ZIP_ER_CRC`:idx: + `libzip.html#124 `_ + + `ZIP_ER_DELETED`:idx: + `libzip.html#140 `_ + + `ZIP_ER_EOF`:idx: + `libzip.html#134 `_ + + `ZIP_ER_EXISTS`:idx: + `libzip.html#127 `_ + + `ZIP_ER_INCONS`:idx: + `libzip.html#138 `_ + + `ZIP_ER_INTERNAL`:idx: + `libzip.html#137 `_ + + `ZIP_ER_INVAL`:idx: + `libzip.html#135 `_ + + `ZIP_ER_MEMORY`:idx: + `libzip.html#131 `_ + + `ZIP_ER_MULTIDISK`:idx: + `libzip.html#118 `_ + + `ZIP_ER_NOENT`:idx: + `libzip.html#126 `_ + + `ZIP_ER_NOZIP`:idx: + `libzip.html#136 `_ + + `ZIP_ER_OK`:idx: + `libzip.html#117 `_ + + `ZIP_ER_OPEN`:idx: + `libzip.html#128 `_ + + `ZIP_ER_READ`:idx: + `libzip.html#122 `_ + + `ZIP_ER_REMOVE`:idx: + `libzip.html#139 `_ + + `ZIP_ER_RENAME`:idx: + `libzip.html#119 `_ + + `zip_error_clear`:idx: + `libzip.html#174 `_ + + `zip_error_get`:idx: + `libzip.html#175 `_ + + `zip_error_get_sys_type`:idx: + `libzip.html#176 `_ + + `zip_error_to_str`:idx: + `libzip.html#177 `_ + + `ZIP_ER_SEEK`:idx: + `libzip.html#121 `_ + + `ZIP_ER_TMPOPEN`:idx: + `libzip.html#129 `_ + + `ZIP_ER_WRITE`:idx: + `libzip.html#123 `_ + + `ZIP_ER_ZIPCLOSED`:idx: + `libzip.html#125 `_ + + `ZIP_ER_ZLIB`:idx: + `libzip.html#130 `_ + + `ZIP_ET_NONE`:idx: + `libzip.html#141 `_ + + `ZIP_ET_SYS`:idx: + `libzip.html#142 `_ + + `ZIP_ET_ZLIB`:idx: + `libzip.html#143 `_ + + `ZIP_EXCL`:idx: + `libzip.html#109 `_ + + `zip_fclose`:idx: + `libzip.html#178 `_ + + `zip_file_error_clear`:idx: + `libzip.html#179 `_ + + `zip_file_error_get`:idx: + `libzip.html#180 `_ + + `zip_file_strerror`:idx: + `libzip.html#181 `_ + + `ZIP_FL_COMPRESSED`:idx: + `libzip.html#113 `_ + + `ZIP_FL_NOCASE`:idx: + `libzip.html#111 `_ + + `ZIP_FL_NODIR`:idx: + `libzip.html#112 `_ + + `ZIP_FL_RECOMPRESS`:idx: + `libzip.html#115 `_ + + `ZIP_FL_UNCHANGED`:idx: + `libzip.html#114 `_ + + `zip_fopen`:idx: + `libzip.html#182 `_ + + `zip_fopen_index`:idx: + `libzip.html#183 `_ + + `zip_fread`:idx: + `libzip.html#184 `_ + + `zip_get_archive_comment`:idx: + `libzip.html#185 `_ + + `zip_get_archive_flag`:idx: + `libzip.html#186 `_ + + `zip_get_file_comment`:idx: + `libzip.html#187 `_ + + `zip_get_name`:idx: + `libzip.html#188 `_ + + `zip_get_num_files`:idx: + `libzip.html#189 `_ + + `zip_name_locate`:idx: + `libzip.html#190 `_ + + `zip_open`:idx: + `libzip.html#191 `_ + + `zip_rename`:idx: + `libzip.html#192 `_ + + `zip_replace`:idx: + `libzip.html#193 `_ + + `zip_set_archive_comment`:idx: + `libzip.html#194 `_ + + `zip_set_archive_flag`:idx: + `libzip.html#195 `_ + + `zip_set_file_comment`:idx: + `libzip.html#196 `_ + + `zip_source_buffer`:idx: + `libzip.html#197 `_ + + `ZIP_SOURCE_CLOSE`:idx: + `libzip.html#166 `_ + + `ZIP_SOURCE_ERROR`:idx: + `libzip.html#168 `_ + + `zip_source_file`:idx: + `libzip.html#198 `_ + + `zip_source_filep`:idx: + `libzip.html#199 `_ + + `zip_source_free`:idx: + `libzip.html#200 `_ + + `zip_source_function`:idx: + `libzip.html#201 `_ + + `ZIP_SOURCE_OPEN`:idx: + `libzip.html#164 `_ + + `ZIP_SOURCE_READ`:idx: + `libzip.html#165 `_ + + `ZIP_SOURCE_STAT`:idx: + `libzip.html#167 `_ + + `zip_source_zip`:idx: + `libzip.html#202 `_ + + `zip_stat`:idx: + `libzip.html#203 `_ + + `zip_stat_index`:idx: + `libzip.html#204 `_ + + `zip_stat_init`:idx: + `libzip.html#205 `_ + + `zip_strerror`:idx: + `libzip.html#206 `_ + + `zip_unchange`:idx: + `libzip.html#207 `_ + + `zip_unchange_all`:idx: + `libzip.html#208 `_ + + `zip_unchange_archive`:idx: + `libzip.html#209 `_ + + `zlibAllocMem`:idx: + `zlib.html#187 `_ + + `zlibFreeMem`:idx: + `zlib.html#188 `_ + + `zlibVersion`:idx: + `zlib.html#142 `_ + + `Z_MEM_ERROR`:idx: + `zlib.html#127 `_ + + `Z_NEED_DICT`:idx: + `zlib.html#123 `_ + + `Z_NO_COMPRESSION`:idx: + `zlib.html#130 `_ + + `Z_NO_FLUSH`:idx: + `zlib.html#116 `_ + + `Z_NULL`:idx: + `zlib.html#141 `_ + + `z_off_t`:idx: + `zlib.html#105 `_ + + `Z_OK`:idx: + `zlib.html#121 `_ + + `Z_PARTIAL_FLUSH`:idx: + `zlib.html#117 `_ + + `Z_STREAM_END`:idx: + `zlib.html#122 `_ + + `Z_STREAM_ERROR`:idx: + `zlib.html#125 `_ + + `Z_SYNC_FLUSH`:idx: + `zlib.html#118 `_ + + `Z_UNKNOWN`:idx: + `zlib.html#139 `_ + + `Z_VERSION_ERROR`:idx: `zlib.html#129 `_ \ No newline at end of file diff --git a/doc/tut1.txt b/doc/tut1.txt new file mode 100644 index 000000000..ef56c2caa --- /dev/null +++ b/doc/tut1.txt @@ -0,0 +1,1382 @@ +============================ +The Nimrod Tutorial (Part I) +============================ + +:Author: Andreas Rumpf +:Version: |nimrodversion| + +.. contents:: + +Introduction +============ + + "Before you run you must learn to walk." + +This document is a tutorial for the programming language *Nimrod*. After this +tutorial you will have a decent knowledge about Nimrod. This tutorial assumes +that you are familiar with basic programming concepts like variables, types +or statements. + + +The first program +================= + +We start the tour with a modified "hallo world" program: + +.. code-block:: Nimrod + # This is a comment + Echo("What's your name? ") + var name: string = readLine(stdin) + Echo("Hi, ", name, "!") + + +Save this code to the file "greetings.nim". Now compile and run it:: + + nimrod compile --run greetings.nim + +As you see, with the ``--run`` switch Nimrod executes the file automatically +after compilation. You can even give your program command line arguments by +appending them after the filename:: + + nimrod compile --run greetings.nim arg1 arg2 + +The most used commands and switches have abbreviations, so you can also use:: + + nimrod c -r greetings.nim + +Though it should be pretty obvious what the program does, I will explain the +syntax: Statements which are not indented are executed when the program +starts. Indentation is Nimrod's way of grouping statements. String literals +are enclosed in double quotes. The ``var`` statement declares a new variable +named ``name`` of type ``string`` with the value that is returned by the +``readline`` procedure. Since the compiler knows that ``readline`` returns +a string, you can leave out the type in the declaration (this is called +`local type inference`:idx:). So this will work too: + +.. code-block:: Nimrod + var name = readline(stdin) + +Note that this is basically the only form of type inference that exists in +Nimrod: It is a good compromise between brevity and readability. + +The "hallo world" program contains several identifiers that are already +known to the compiler: ``echo``, ``readLine``, etc. These built-in items are +declared in the system_ module which is implicitly imported by any other module. + + +Lexical elements +================ + +Let us look at Nimrod's lexical elements in more detail: Like other +programming languages Nimrod consists of (string) literals, identifiers, +keywords, comments, operators, and other punctation marks. Case is +*insignificant* in Nimrod and even underscores are ignored: +``This_is_an_identifier`` and this is the same identifier +``ThisIsAnIdentifier``. This feature enables you to use other +peoples code without bothering about a naming convention that conflicts with +yours. It also frees you from remembering the exact spelling of an identifier +(was it ``parseURL`` or ``parseUrl`` or ``parse_URL``?). + + +String and character literals +----------------------------- + +String literals are enclosed in double quotes; character literals in single +quotes. Special characters are escaped with ``\``: ``\n`` means newline, ``\t`` +means tabulator, etc. There exist also *raw* string literals: + +.. code-block:: Nimrod + r"C:\program files\nim" + +In raw literals the backslash is not an escape character, so they fit +the principle *what you see is what you get*. + +The third and last way to write string literals are *long string literals*. +They are written with three quotes: ``""" ... """``; they can span over +multiple lines and the ``\`` is not an escape character either. They are very +useful for embedding HTML code templates for example. + + +Comments +-------- + +`Comments`:idx: start anywhere outside a string or character literal with the +hash character ``#``. Documentation comments start with ``##``. +Comments consist of a concatenation of `comment pieces`:idx:. A comment piece +starts with ``#`` and runs until the end of the line. The end of line characters +belong to the piece. If the next line only consists of a comment piece which is +aligned to the preceding one, it does not start a new comment: + +.. code-block:: nimrod + + i = 0 # This is a single comment over multiple lines belonging to the + # assignment statement. The scanner merges these two pieces. + # This is a new comment belonging to the current block, but to no particular + # statement. + i = i + 1 # This a new comment that is NOT + echo(i) # continued here, because this comment refers to the echo statement + +Comments are tokens; they are only allowed at certain places in the input file +as they belong to the syntax tree! This feature enables perfect source-to-source +transformations (such as pretty-printing) and superior documentation generators. +A nice side-effect is that the human reader of the code always knows exactly +which code snippet the comment refers to. Since comments are a proper part of +the syntax, watch their indentation: + +.. code-block:: + Echo("Hallo!") + # comment has the same indentation as above statement -> fine + Echo("Hi!") + # comment has not the right indentation -> syntax error! + + +Numbers +------- + +Numerical literals are written as in most other languages. As a special twist, +underscores are allowed for better readability: ``1_000_000`` (one million). +A number that contains a dot (or 'e' or 'E') is a floating point literal: +``1.0e9`` (one million). Hexadecimal literals are prefixed with ``0x``, +binary literals with ``0b`` and octal literals with ``0c``. A leading zero +alone does not produce an octal. + + +The var statement +================= +The var statement declares a new local or global variable: + +.. code-block:: + var x, y: int # declares x and y to have the type ``int`` + +Indentation can be used after the ``var`` keyword to list a whole section of +variables: + +.. code-block:: + var + x, y: int + # a comment can occur here too + a, b, c: string + + +The assignment statement +======================== + +The assignment statement assigns a new value to a variable or more generally +to a storage location: + +.. code-block:: + var x = "abc" # introduces a new variable `x` and assigns a value to it + x = "xyz" # assigns a new value to `x` + +The ``=`` is called the *assignment operator*. The assignment operator cannot +be overloaded, overwritten or forbidden, but this might change in a future +version of Nimrod. + + +Constants +========= + +`Constants`:idx: are symbols which are bound to a value. The constant's value +cannot change. The compiler must be able to evaluate the expression in a +constant declaration at compile time: + +.. code-block:: nimrod + const x = "abc" # the constant x contains the string "abc" + +Indentation can be used after the ``const`` keyword to list a whole section of +constants: + +.. code-block:: + const + x = 1 + # a comment can occur here too + y = 2 + z = y + 5 # simple computations are possible + + +Control flow statements +======================= + +The greetings program consists of 3 statements that are executed sequentially. +Only the most primitive programs can get away with that: Branching and looping +are needed too. + + +If statement +------------ + +The if statement is one way to branch the control flow: + +.. code-block:: nimrod + var name = readLine(stdin) + if name == "": + echo("Poor soul, you lost your name?") + elif name == "name": + echo("Very funny, your name is name.") + else: + Echo("Hi, ", name, "!") + +There can be zero or more elif parts, and the else part is optional. The +keyword ``elif`` is short for ``else if``, and is useful to avoid excessive +indentation. (The ``""`` is the empty string. It contains no characters.) + + +Case statement +-------------- + +Another way to branch is provided by the case statement. A case statement is +a multi-branch: + +.. code-block:: nimrod + var name = readLine(stdin) + case name + of "": + echo("Poor soul, you lost your name?") + of "name": + echo("Very funny, your name is name.") + of "Dave", "Frank": + echo("Cool name!") + else: + Echo("Hi, ", name, "!") + +As can be seen, for an ``of`` branch a comma separated list of values is also +allowed. + +The case statement can deal with integers, other ordinal types and strings. +(What an ordinal type is will be explained soon.) +For integers or other ordinal types value ranges are also possible: + +.. code-block:: nimrod + # this statement will be explained later: + from strutils import parseInt + + Echo("A number please: ") + var n = parseInt(readLine(stdin)) + case n + of 0..2, 4..7: Echo("The number is in the set: {0, 1, 2, 4, 5, 6, 7}") + of 3, 8: Echo("The number is 3 or 8") + +However, the above code does not compile: The reason is that you have to cover +every value that ``n`` may contain, but the code only handles the values +``0..8``. Since it is not very practical to list every other possible integer +(though it is possible thanks to the range notation!), we fix this by telling +the compiler that for every other value nothing should be done: + +.. code-block:: nimrod + ... + case n + of 0..2, 4..7: Echo("The number is in the set: {0, 1, 2, 4, 5, 6, 7}") + of 3, 8: Echo("The number is 3 or 8") + else: nil + +The ``nil`` statement is a *do nothing* statement. The compiler knows that a +case statement with an else part cannot fail and thus the error disappers. Note +that it is impossible to cover any possible string value: That is why there is +no such compiler check for string cases. + +In general the case statement is used for subrange types or enumerations where +it is of great help that the compiler checks that you covered any possible +value. + + + +While statement +--------------- + +The while statement is a simple looping construct: + +.. code-block:: nimrod + + Echo("What's your name? ") + var name = readLine(stdin) + while name == "": + Echo("Please tell me your name: ") + name = readLine(stdin) + # no ``var``, because we do not declare a new variable here + +The example uses a while loop to keep asking the user for his name, as long as +he types in nothing (only presses RETURN). + + +For statement +------------- + +The `for`:idx: statement is a construct to loop over any elements an *iterator* +provides. The example uses the built-in ``countup`` iterator: + +.. code-block:: nimrod + Echo("Counting to ten: ") + for i in countup(1, 10): + Echo($i) + +The built-in ``$`` operator turns an integer (``int``) and many other types +into a string. The variable ``i`` is implicitely declared by the ``for`` loop +and has the type ``int``, because that is what ``countup`` returns. ``i`` runs +through the values 1, 2, .., 10. Each value is ``echo``-ed. This code does +the same: + +.. code-block:: nimrod + Echo("Counting to 10: ") + var i = 1 + while i <= 10: + Echo($i) + inc(i) # increment i by 1 + +Counting down can be achieved as easily (but is much less needed): + +.. code-block:: nimrod + Echo("Counting down from 10 to 1: ") + for i in countdown(10, 1): + Echo($i) + +Since counting up occurs so often in programs, Nimrod has a special syntax that +calls the ``countup`` iterator implicitely: + +.. code-block:: nimrod + for i in 1..10: + ... + +The syntax ``for i in 1..10`` is sugar for ``for i in countup(1, 10)``. +``countdown`` does not have any such sugar. + + +Scopes and the block statement +------------------------------ +Control flow statements have a feature not covered yet: They open a +new scope. This means that in the following example, ``x`` is not accessible +outside the loop: + +.. code-block:: nimrod + while false: + var x = "hi" + echo(x) # does not work + +A while (for) statement introduces an implicit block. Identifiers +are only visible within the block they have been declared. The ``block`` +statement can be used to open a new block explicitely: + +.. code-block:: nimrod + block myblock: + var x = "hi" + echo(x) # does not work either + +The block's `label` (``myblock`` in the example) is optional. + + +Break statement +--------------- +A block can be left prematurely with a ``break`` statement. The break statement +can leave a while, for, or a block statement. It leaves the innermost construct, +unless the label of a block is given: + +.. code-block:: nimrod + block myblock: + Echo("entering block") + while true: + Echo("looping") + break # leaves the loop, but not the block + Echo("still in block") + + block myblock2: + Echo("entering block") + while true: + Echo("looping") + break myblock2 # leaves the block (and the loop) + Echo("still in block") + + +Continue statement +------------------ +Like in many other programming languages, a ``continue`` statement leads to +the next iteration immediately: + +.. code-block:: nimrod + while true: + var x = readLine(stdin) + if x == "": continue + Echo(x) + + +When statement +-------------- + +Example: + +.. code-block:: nimrod + + when system.hostOS == "windows": + echo("running on Windows!") + elif system.hostOS == "linux": + echo("running on Linux!") + elif system.hostOS == "macosx": + echo("running on Mac OS X!") + else: + echo("unknown operating system") + +The `when`:idx: statement is almost identical to the ``if`` statement with some +differences: + +* Each condition has to be a constant expression since it is evaluated by the + compiler. +* The statements within a branch do not open a new scope. +* The compiler checks the semantics and produces code *only* for the statements + that belong to the first condition that evaluates to ``true``. + +The ``when`` statement is useful for writing platform specific code, similar to +the ``#ifdef`` construct in the C programming language. + +**Note**: The documentation generator currently always follows the first branch +of when statements. + + +Statements and indentation +========================== + +Now that we covered the basic control flow statements, let's return to Nimrod +indentation rules. + +In Nimrod there is a distinction between *simple statements* and *complex +statements*. *Simple statements* cannot contain other statements: +Assignment, procedure calls or the ``return`` statement belong to the simple +statements. *Complex statements* like ``if``, ``when``, ``for``, ``while`` can +contain other statements. To avoid ambiguities, complex statements always have +to be intended, but single simple statements do not: + +.. code-block:: nimrod + # no indentation needed for single assignment statement: + if x: x = false + + # indentation needed for nested if statement: + if x: + if y: + y = false + else: + y = true + + # indentation needed, because two statements follow the condition: + if x: + x = false + y = false + + +*Expressions* are parts of a statement which usually result in a value. The +condition in an if statement is an example for an expression. Expressions can +contain indentation at certain places for better readability: + +.. code-block:: nimrod + + if thisIsaLongCondition() and + thisIsAnotherLongCondition(1, + 2, 3, 4): + x = true + +As a rule of thumb, indentation within expressions is allowed after operators, +an open parenthesis and after commas. + + +Procedures +========== + +To define new commands like ``echo``, ``readline`` in the examples, the concept +of a `procedure` is needed. (Some languages call them *methods* or +*functions*.) In Nimrod new procedures are defined with the ``proc`` keyword: + +.. code-block:: nimrod + proc yes(question: string): bool = + Echo(question, " (y/n)") + while true: + case readLine(stdin) + of "y", "Y", "yes", "Yes": return true + of "n", "N", "no", "No": return false + else: Echo("Please be clear: yes or no") + + if yes("Should I delete all your important files?"): + Echo("I'm sorry Dave, I'm afraid I can't do that.") + else: + Echo("I think you know what the problem is just as well as I do.") + +This example shows a procedure named ``yes`` that asks the user a ``question`` +and returns true if he answered "yes" (or something similar) and returns +false if he answered "no" (or something similar). A ``return`` statement leaves +the procedure (and therefore the while loop) immediately. The +``(question: string): bool`` syntax describes that the procedure expects a +parameter named ``question`` of type ``string`` and returns a value of type +``bool``. ``Bool`` is a built-in type: The only valid values for ``bool`` are +``true`` and ``false``. +The conditions in if or while statements need to have the type ``bool``. + +Some terminology: In the example ``question`` is called a (formal) *parameter*, +``"Should I..."`` is called an *argument* that is passed to this parameter. + + +Result variable +--------------- +A procedure that returns a value has an implicit ``result`` variable that +represents the return value. A ``return`` statement with no expression is a +shorthand for ``return result``. So all tree code snippets are equivalent: + +.. code-block:: nimrod + return 42 + + result = 42 + return + + result = 42 + return result + + +Parameters +---------- +Parameters are constant in the procedure body. Their value cannot be changed +because this allows the compiler to implement parameter passing in the most +efficient way. If the procedure needs to modify the argument for the +caller, a ``var`` parameter can be used: + +.. code-block:: nimrod + proc divmod(a, b: int, res, remainder: var int) = + res = a div b + remainder = a mod b + + var + x, y: int + divmod(8, 5, x, y) # modifies x and y + echo(x) + echo(y) + +In the example, ``res`` and ``remainder`` are `var parameters`. +Var parameters can be modified by the procedure and the changes are +visible to the caller. + + +Discard statement +----------------- +To call a procedure that returns a value just for its side effects and ignoring +its return value, a discard statement **has** to be used. Nimrod does not +allow to silently throw away a return value: + +.. code-block:: nimrod + discard yes("May I ask a pointless question?") + + +Named arguments +--------------- + +Often a procedure has many parameters and it is not clear in which order the +parameters appeared. This is especially true for procedures that construct a +complex data type. Therefore the arguments to a procedure can be named, so +that it is clear which argument belongs to which parameter: + +.. code-block:: nimrod + proc createWindow(x, y, width, height: int, title: string, + show: bool): Window = + ... + + var w = createWindow(show = true, title = "My Application", + x = 0, y = 0, height = 600, width = 800) + +Now that we use named arguments to call ``createWindow`` the argument order +does not matter anymore. Mixing named arguments with ordered arguments is +also possible, but not very readable: + +.. code-block:: nimrod + var w = createWindow(0, 0, title = "My Application", + height = 600, width = 800, true) + +The compiler checks that each parameter receives exactly one argument. + + +Default values +-------------- +To make the ``createWindow`` proc easier to use it should provide `default +values`, these are values that are used as arguments if the caller does not +specify them: + +.. code-block:: nimrod + proc createWindow(x = 0, y = 0, width = 500, height = 700, + title = "unknown", + show = true): Window = + ... + + var w = createWindow(title = "My Application", height = 600, width = 800) + +Now the call to ``createWindow`` only needs to set the values that differ +from the defaults. + +Note that type inference works for parameters with default values, there is +no need to specify ``title: string = "unknown"``, for example. + + +Overloaded procedures +--------------------- +Nimrod provides the ability to overload procedures similar to C++: + +.. code-block:: nimrod + proc toString(x: int): string = ... + proc toString(x: bool): string = + if x: return "true" else: return "false" + + Echo(toString(13)) # calls the toString(x: int) proc + Echo(toString(true)) # calls the toString(x: bool) proc + +(Note that ``toString`` is usually the ``$`` operator in Nimrod.) +The compiler chooses the most appropriate proc for the ``toString`` calls. How +this overloading resolution algorithm works exactly is not discussed here +(it will be specified in the manual soon). +However, it does not lead to nasty suprises and is based on a quite simple +unification algorithm. Ambigious calls are reported as errors. + + +Operators +--------- +The Nimrod library makes heavy use of overloading - one reason for this is that +each operator like ``+`` is a just an overloaded proc. The parser lets you +use operators in `infix notation` (``a + b``) or `prefix notation` (``+ a``). +An infix operator always receives two arguments, a prefix operator always one. +Postfix operators are not possible, because this would be ambigious: Does +``a @ @ b`` mean ``(a) @ (@b)`` or ``(a@) @ (b)``? It always means +``(a) @ (@b)``, because there are no postfix operators in Nimrod. + +Apart from a few built-in keyword operators such as ``and``, ``or``, ``not``, +operators always consist of these characters: +``+ - * \ / < > = @ $ ~ & % ! ? ^ . |`` + +User defined operators are allowed. Nothing stops you from defining your own +``@!?+~`` operator, but readability can suffer. + +The operator's precedence is determined by its first character. The details +can be found in the manual. + +To define a new operator enclose the operator in "``": + +.. code-block:: nimrod + proc `$` (x: myDataType): string = ... + # now the $ operator also works with myDataType, overloading resolution + # ensures that $ works for built-in types just like before + +The "``" notation can also be used to call an operator just like a procedure +with a real name: + +.. code-block:: nimrod + if `==`( `+`(3, 4), 7): Echo("True") + + +Forward declarations +-------------------- + +Every variable, procedure, etc. needs to be declared before it can be used. +(The reason for this is compilation efficiency.) +However, this cannot be done for mutually recursive procedures: + +.. code-block:: nimrod + # forward declaration: + proc even(n: int): bool + + proc odd(n: int): bool = + if n == 1: return true + else: return even(n-1) + + proc even(n: int): bool = + if n == 0: return true + else: return odd(n-1) + +Here ``odd`` depends on ``even`` and vice versa. Thus ``even`` needs to be +introduced to the compiler before it is completely defined. The syntax for +such a `forward declaration` is simple: Just omit the ``=`` and the procedure's +body. + + +Iterators +========= + +Let's return to the boring counting example: + +.. code-block:: nimrod + Echo("Counting to ten: ") + for i in countup(1, 10): + Echo($i) + +Can a ``countup`` proc be written that supports this loop? Lets try: + +.. code-block:: nimrod + proc countup(a, b: int): int = + var res = a + while res <= b: + return res + inc(res) + +However, this does not work. The problem is that the procedure should not +only ``return``, but return and **continue** after an iteration has +finished. This *return and continue* is called a `yield` statement. Now +the only thing left to do is to replace the ``proc`` keyword by ``iterator`` +and there it is - our first iterator: + +.. code-block:: nimrod + iterator countup(a, b: int): int = + var res = a + while res <= b: + yield res + inc(res) + +Iterators look very similar to procedures, but there are several +important differences: + +* Iterators can only be called from for loops. +* Iterators cannot contain a ``return`` statement and procs cannot contain a + ``yield`` statement. +* Iterators have no implicit ``result`` variable. +* Iterators do not support recursion. (This restriction will be gone in a + future version of the compiler.) +* Iterators cannot be forward declared, because the compiler must be able + to inline an iterator. (This restriction will be gone in a + future version of the compiler.) + + +Basic types +=========== + +This section deals with the basic built-in types and the operations +that are available for them in detail. + +Booleans +-------- + +The `boolean`:idx: type is named ``bool`` in Nimrod and consists of the two +pre-defined values ``true`` and ``false``. Conditions in while, +if, elif, when statements need to be of type bool. + +The operators ``not, and, or, xor, <, <=, >, >=, !=, ==`` are defined +for the bool type. The ``and`` and ``or`` operators perform short-cut +evaluation. Example: + +.. code-block:: nimrod + + while p != nil and p.name != "xyz": + # p.name is not evaluated if p == nil + p = p.next + + +Characters +---------- +The `character type` is named ``char`` in Nimrod. Its size is one byte. +Thus it cannot represent an UTF-8 character, but a part of it. +The reason for this is efficiency: For the overwhelming majority of use-cases, +the resulting programs will still handle UTF-8 properly as UTF-8 was specially +designed for this. +Character literals are enclosed in single quotes. + +Chars can be compared with the ``==``, ``<``, ``<=``, ``>``, ``>=`` operators. +The ``$`` operator converts a ``char`` to a ``string``. Chars cannot be mixed +with integers; to get the ordinal value of a ``char`` use the ``ord`` proc. +Converting from an integer to a ``char`` is done with the ``chr`` proc. + + +Strings +------- +String variables in Nimrod are **mutable**, so appending to a string +is quite efficient. Strings in Nimrod are both zero-terminated and have a +length field. One can retrieve a string's length with the builtin ``len`` +procedure; the length never counts the terminating zero. Accessing the +terminating zero is no error and often leads to simpler code: + +.. code-block:: nimrod + if s[i] == 'a' and s[i+1] == 'b' and s[i+2] == '\0': + # no need to check whether ``i < len(s)``! + ... + +The assignment operator for strings copies the string. + +Strings are compared by their lexicographical order. All comparison operators +are available. Per convention, all strings are UTF-8 strings, but this is not +enforced. For example, when reading strings from binary files, they are merely +a sequence of bytes. The index operation ``s[i]`` means the i-th *char* of +``s``, not the i-th *unichar*. + +String variables are initialized with a special value, called ``nil``. However, +most string operations cannot deal with ``nil`` (leading to an exception being +raised) for performance reasons. Thus one should use empty strings ``""`` +rather than ``nil`` as the *empty* value. But ``""`` often creates a string +object on the heap, so there is a trade-off to be made here. + + +Integers +-------- +Nimrod has these integer types built-in: ``int int8 int16 int32 int64``. These +are all signed integer types, there are no `unsigned integer`:idx: types, only +`unsigned operations`:idx: that treat their arguments as unsigned. + +The default integer type is ``int``. Integer literals can have a *type suffix* +to mark them to be of another integer type: + + +.. code-block:: nimrod + var + x = 0 # x is of type ``int`` + y = 0'i8 # y is of type ``int8`` + z = 0'i64 # z is of type ``int64`` + +Most often integers are used for couting objects that reside in memory, so +``int`` has the same size as a pointer. + +The common operators ``+ - * div mod < <= == != > >=`` are defined for +integers. The ``and or xor not`` operators are defined for integers too and +provide *bitwise* operations. Left bit shifting is done with the ``shl``, right +shifting with the ``shr`` operator. Bit shifting operators always treat their +arguments as *unsigned*. For `arithmetic bit shifts`:idx: ordinary +multiplication or division can be used. + +Unsigned operations all wrap around; they cannot lead to over- or underflow +errors. Unsigned operations use the ``%`` suffix as convention: + +====================== ====================================================== +operation meaning +====================== ====================================================== +``a +% b`` unsigned integer addition +``a -% b`` unsigned integer substraction +``a *% b`` unsigned integer multiplication +``a /% b`` unsigned integer division +``a %% b`` unsigned integer modulo operation +``a <% b`` treat ``a`` and ``b`` as unsigned and compare +``a <=% b`` treat ``a`` and ``b`` as unsigned and compare +====================== ====================================================== + +`Automatic type conversion`:idx: is performed in expressions where different +kinds of integer types are used. However, if the type conversion +loses information, the `EOutOfRange`:idx: exception is raised (if the error +cannot be detected at compile time). + + + +Floats +------ +Nimrod has these floating point types built-in: ``float float32 float64``. + +The default float type is ``float``. In the current implementation, +``float`` is always 64 bit wide. + +Float literals can have a *type suffix* to mark them to be of another float +type: + +.. code-block:: nimrod + var + x = 0.0 # x is of type ``float`` + y = 0.0'f32 # y is of type ``float32`` + z = 0.0'f64 # z is of type ``int64`` + +The common operators ``+ - * / < <= == != > >=`` are defined for +floats and follow the IEEE standard. + +Automatic type conversion in expressions with different kinds +of floating point types is performed: The smaller type is +converted to the larger. Integer types are **not** converted to floating point +types automatically and vice versa. The ``toInt`` and ``toFloat`` procs can be +used for these conversions. + + +Advanced types +============== + +In Nimrod new types can be defined within a ``type`` statement: + +.. code-block:: nimrod + type + biggestInt = int64 # biggest integer type that is available + biggestFLoat = float64 # biggest float type that is available + +Enumeration and object types cannot be defined on the fly, but only within a +``type`` statement. + + +Enumerations +------------ +A variable of an `enumeration`:idx: type can only be assigned a value of a +limited set. This set consists of ordered symbols. Each symbol is mapped +to an integer value internally. The first symbol is represented +at runtime by 0, the second by 1 and so on. Example: + +.. code-block:: nimrod + + type + TDirection = enum + north, east, south, west + + var x = south # `x` is of type `TDirection`; its value is `south` + echo($x) # writes "south" to `stdout` + +(To prefix a new type with the letter ``T`` is a convention in Nimrod.) +All comparison operators can be used with enumeration types. + +An enumeration's symbol can be qualified to avoid ambiguities: +``TDirection.south``. + +The ``$`` operator can convert any enumeration value to its name, the ``ord`` +proc to its underlying integer value. + +For better interfacing to other programming languages, the symbols of enum +types can be assigned an explicit ordinal value. However, the ordinal values +have to be in ascending order. A symbol whose ordinal value is not +explicitly given is assigned the value of the previous symbol + 1. + +An explicit ordered enum can have *wholes*: + +.. code-block:: nimrod + type + TMyEnum = enum + a = 2, b = 4, c = 89 + + +Ordinal types +------------- +Enumerations without wholes, integer types, ``char`` and ``bool`` (and +subranges) are called `ordinal`:idx: types. Ordinal types have quite +a few special operations: + +----------------- -------------------------------------------------------- +Operation Comment +----------------- -------------------------------------------------------- +``ord(x)`` returns the integer value that is used to + represent `x`'s value +``inc(x)`` increments `x` by one +``inc(x, n)`` increments `x` by `n`; `n` is an integer +``dec(x)`` decrements `x` by one +``dec(x, n)`` decrements `x` by `n`; `n` is an integer +``succ(x)`` returns the successor of `x` +``succ(x, n)`` returns the `n`'th successor of `x` +``succ(x)`` returns the predecessor of `x` +``succ(x, n)`` returns the `n`'th predecessor of `x` +----------------- -------------------------------------------------------- + +The ``inc dec succ pred`` operations can fail by raising an `EOutOfRange` or +`EOverflow` exception. (If the code has been compiled with the proper runtime +checks turned on.) + + +Subranges +--------- +A `subrange`:idx: type is a range of values from an integer or enumeration type +(the base type). Example: + +.. code-block:: nimrod + type + TSubrange = range[0..5] + + +``TSubrange`` is a subrange of ``int`` which can only hold the values 0 +to 5. Assigning any other value to a variable of type ``TSubrange`` is a +compile-time or runtime error. Assignments from the base type to one of its +subrange types (and vice versa) are allowed. + +The ``system`` module defines the important ``natural`` type as +``range[0..high(int)]`` (``high`` returns the maximal value). Other programming +languages mandate the usage of unsigned integers for natural numbers. This is +often **wrong**: You don't want unsigned arithmetic (which wraps around) just +because the numbers cannot be negative. Nimrod's ``natural`` type helps to +avoid this common programming error. + + +Sets +---- +The `set type`:idx: models the mathematical notion of a set. The set's +basetype can only be an ordinal type. The reason is that sets are implemented +as high performance bit vectors. + +Sets can be constructed via the set constructor: ``{}`` is the empty set. The +empty set is type combatible with any concrete set type. The constructor +can also be used to include elements (and ranges of elements): + +.. code-block:: nimrod + type + TCharSet = set[char] + var + x: TCharSet + x = {'a'..'z', '0'..'9'} # This constructs a set that conains the + # letters from 'a' to 'z' and the digits + # from '0' to '9' + +These operations are supported by sets: + +================== ======================================================== +operation meaning +================== ======================================================== +``A + B`` union of two sets +``A * B`` intersection of two sets +``A - B`` difference of two sets (A without B's elements) +``A == B`` set equality +``A <= B`` subset relation (A is subset of B or equal to B) +``A < B`` strong subset relation (A is a real subset of B) +``e in A`` set membership (A contains element e) +``e notin A`` A does not contain element e +``contains(A, e)`` A contains element e +``A -+- B`` symmetric set difference (= (A - B) + (B - A)) +``card(A)`` the cardinality of A (number of elements in A) +``incl(A, elem)`` same as ``A = A + {elem}`` +``excl(A, elem)`` same as ``A = A - {elem}`` +================== ======================================================== + +Sets are often used to define a type for the *flags* of a procedure. This is +much cleaner (and type safe solution) solution than just defining integer +constants that should be ``or``'ed together. + + +Arrays +------ +An `array`:idx: is a simple fixed length container. Each element in +the array has the same type. The array's index type can be any ordinal type. + +Arrays can be constructed via the array constructor: ``[]`` is the empty +array. The constructor can also be used to include elements. + +.. code-block:: nimrod + + type + TIntArray = array[0..5, int] # an array that is indexed with 0..5 + var + x: TIntArray + x = [1, 2, 3, 4, 5, 6] + for i in low(x)..high(x): + echo(x[i]) + +The notation ``x[i]`` is used to access the i-th element of ``x``. +Array access is always bounds checked (at compile-time or at runtime). These +checks can be disabled via pragmas or invoking the compiler with the +``--bound_checks:off`` command line switch. + +Arrays are value types, like any other Nimrod type. The assignment operator +copies the whole array contents. + +The built-in ``len`` proc returns the array's length. ``low(a)`` returns the +lowest valid index for the array `a` and ``high(a)`` the highest valid index. + + +Open arrays +----------- +Often fixed size arrays turn out to be too inflexible; procedures should +be able to deal with arrays of different sizes. The `openarray`:idx: type +allows this. Openarrays are always indexed with an ``int`` starting at +position 0. The ``len``, ``low`` and ``high`` operations are available +for open arrays too. Any array with a compatible base type can be passed to +an openarray parameter, the index type does not matter. + +The openarray type cannot be nested: Multidimensional openarrays are not +supported because this is seldom needed and cannot be done efficiently. + +An openarray is also a means to implement passing a variable number of +arguments to a procedure. The compiler converts the list of arguments +to an array automatically: + +.. code-block:: nimrod + proc myWriteln(f: TFile, a: openarray[string]) = + for s in items(a): + write(f, s) + write(f, "\n") + + myWriteln(stdout, "abc", "def", "xyz") + # is transformed by the compiler to: + myWriteln(stdout, ["abc", "def", "xyz"]) + +This transformation is only done if the openarray parameter is the +last parameter in the procedure header. + + +Sequences +--------- +`Sequences`:idx: are similar to arrays but of dynamic length which may change +during runtime (like strings). Since sequences are resizeable they are always +allocated on the heap and garbage collected. + +Sequences are always indexed with an ``int`` starting at position 0. +The ``len``, ``low`` and ``high`` operations are available for sequences too. +The notation ``x[i]`` can be used to access the i-th element of ``x``. + +Sequences can be constructed by the array constructor ``[]`` in conjunction +with the array to sequence operator ``@``. Another way to allocate space for +a sequence is to call the built-in ``newSeq`` procedure. + +A sequence may be passed to an openarray parameter. + +Example: + +.. code-block:: nimrod + + var + x: seq[int] # a sequence of integers + x = @[1, 2, 3, 4, 5, 6] # the @ turns the array into a sequence + +Sequence variables are initialized with ``nil``. However, most sequence +operations cannot deal with ``nil`` (leading to an exception being +raised) for performance reasons. Thus one should use empty sequences ``@[]`` +rather than ``nil`` as the *empty* value. But ``@[]`` creates a sequence +object on the heap, so there is a trade-off to be made here. + + +Tuples +------ + +A tuple type defines various named *fields* and an *order* of the fields. +The constructor ``()`` can be used to construct tuples. The order of the +fields in the constructor must match the order in the tuple's definition. +Different tuple-types are *equivalent* if they specify the same fields of +the same type in the same order. + +The assignment operator for tuples copies each component. The notation +``t.field`` is used to access a tuple's field. Another notation is +``t[i]`` to access the ``i``'th field. Here ``i`` needs to be a constant +integer. + +.. code-block:: nimrod + + type + TPerson = tuple[name: string, age: int] # type representing a person: + # a person consists of a name + # and an age + var + person: TPerson + person = (name: "Peter", age: 30) + # the same, but less readable: + person = ("Peter", 30) + + echo(person.name) # "Peter" + echo(person.age) # 30 + + echo(person[0]) # "Peter" + echo(person[1]) # 30 + + +Reference and pointer types +--------------------------- +References (similiar to `pointers`:idx: in other programming languages) are a +way to introduce many-to-one relationships. This means different references can +point to and modify the same location in memory. + +Nimrod distinguishes between `traced`:idx: and `untraced`:idx: references. +Untraced references are also called *pointers*. Traced references point to +objects of a garbage collected heap, untraced references point to +manually allocated objects or to objects somewhere else in memory. Thus +untraced references are *unsafe*. However for certain low-level operations +(accessing the hardware) untraced references are unavoidable. + +Traced references are declared with the **ref** keyword, untraced references +are declared with the **ptr** keyword. + +The ``^`` operator can be used to *derefer* a reference, meaning to retrieve +the item the reference points to. The ``addr`` procedure returns the address +of an item. An address is always an untraced reference: +``addr`` is an *unsafe* feature. + +The ``.`` (access a tuple/object field operator) +and ``[]`` (array/string/sequence index operator) operators perform implicit +dereferencing operations for reference types: + +.. code-block:: nimrod + + type + PNode = ref TNode + TNode = tuple[le, ri: PNode, data: int] + var + n: PNode + new(n) + n.data = 9 # no need to write n^ .data + +(As a convention, reference types use a 'P' prefix.) + +To allocate a new traced object, the built-in procedure ``new`` has to be used. +To deal with untraced memory, the procedures ``alloc``, ``dealloc`` and +``realloc`` can be used. The documentation of the system module contains +further information. + +If a reference points to *nothing*, it has the value ``nil``. + +Special care has to be taken if an untraced object contains traced objects like +traced references, strings or sequences: In order to free everything properly, +the built-in procedure ``GCunref`` has to be called before freeing the untraced +memory manually: + +.. code-block:: nimrod + type + TData = tuple[x, y: int, s: string] + + # allocate memory for TData on the heap: + var d = cast[ptr TData](alloc0(sizeof(TData))) + + # create a new string on the garbage collected heap: + d.s = "abc" + + # tell the GC that the string is not needed anymore: + GCunref(d.s) + + # free the memory: + dealloc(d) + +Without the ``GCunref`` call the memory allocated for the ``d.s`` string would +never be freed. The example also demonstrates two important features for low +level programming: The ``sizeof`` proc returns the size of a type or value +in bytes. The ``cast`` operator can circumvent the type system: The compiler +is forced to treat the result of the ``alloc0`` call (which returns an untyped +pointer) as if it would have the type ``ptr TData``. Casting should only be +done if it is unavoidable: It breaks type safety and bugs can lead to +mysterious crashes. + +**Note**: The example only works because the memory is initialized with zero +(``alloc0`` instead of ``alloc`` does this): ``d.s`` is thus initialized to +``nil`` which the string assignment can handle. You need to know low level +details like this when mixing garbage collected data with unmanaged memory! + + +Procedural type +--------------- +A `procedural type`:idx: is a (somewhat abstract) pointer to a procedure. +``nil`` is an allowed value for a variable of a procedural type. +Nimrod uses procedural types to achieve `functional`:idx: programming +techniques. Dynamic dispatch for OOP constructs can also be implemented with +procedural types (details follow in the OOP section). + +Example: + +.. code-block:: nimrod + + type + TCallback = proc (x: int) + + proc echoItem(x: Int) = echo(x) + + proc forEach(callback: TCallback) = + const + data = [2, 3, 5, 7, 11] + for d in items(data): + callback(d) + + forEach(echoItem) + +A subtle issue with procedural types is that the calling convention of the +procedure influences the type compability: Procedural types are only compatible +if they have the same calling convention. The different calling conventions are +listed in the `user guide `_. + + +Modules +======= +Nimrod supports splitting a program into pieces with a `module`:idx: concept. +Each module is in its own file. Modules enable `information hiding`:idx: and +`separate compilation`:idx:. A module may gain access to symbols of another +module by the `import`:idx: statement. Only top-level symbols that are marked +with an asterisk (``*``) are exported: + +.. code-block:: nimrod + # Module A + var + x*, y: int + + proc `*` *(a, b: seq[int]): seq[int] = + # allocate a new sequence: + newSeq(result, len(a)) + # multiply two int sequences: + for i in 0..len(a)-1: result[i] = a[i] * b[i] + +The above module exports ``x`` and ``*``, but not ``y``. + +Modules that depend on each other are possible, but strongly discouraged, +because then one module cannot be reused without the other. + +The algorithm for compiling modules is: + +- Compile the whole module as usual, following import statements recursively +- if there is a cycle only import the already parsed symbols (that are + exported); if an unknown identifier occurs then abort + +This is best illustrated by an example: + +.. code-block:: nimrod + # Module A + type + T1* = int # Module A exports the type ``T1`` + import B # the compiler starts parsing B + + proc main() = + var i = p(3) # works because B has been parsed completely here + + main() + + + # Module B + import A # A is not parsed here! Only the already known symbols + # of A are imported. + + proc p*(x: A.T1): A.T1 = + # this works because the compiler has already + # added T1 to A's interface symbol table + return x + 1 + + +A symbol of a module *can* be *qualified* with the ``module.symbol`` syntax. If +the symbol is ambigious, it even *has* to be qualified. A symbol is ambigious +if it is defined in two (or more) different modules and both modules are +imported by a third one: + +.. code-block:: nimrod + # Module A + var x*: string + + # Module B + var x*: int + + # Module C + import A, B + write(stdout, x) # error: x is ambigious + write(stdout, A.x) # no error: qualifier used + + var x = 4 + write(stdout, x) # not ambigious: uses the module C's x + + +But this rule does not apply to procedures or iterators. Here the overloading +rules apply: + +.. code-block:: nimrod + # Module A + proc x*(a: int): string = return $a + + # Module B + proc x*(a: string): string = return $a + + # Module C + import A, B + write(stdout, x(3)) # no error: A.x is called + write(stdout, x("")) # no error: B.x is called + + proc x*(a: int): string = nil + write(stdout, x(3)) # ambigious: which `x` is to call? + + +From statement +-------------- + +We have already seen the simple ``import`` statement that just imports all +exported symbols. An alternative that only imports listed symbols is the +``from import`` statement: + +.. code-block:: nimrod + from mymodule import x, y, z + + +Include statement +----------------- +The `include`:idx: statement does something fundametally different than +importing a module: It merely includes the contents of a file. The ``include`` +statement is useful to split up a large module into several files: + +.. code-block:: nimrod + include fileA, fileB, fileC + +**Note**: The documentation generator currently does not follow ``include`` +statements, so exported symbols in an include file will not show up in the +generated documentation. + + +Part 2 +====== + +So, now that we are done with the basics, let's see what Nimrod offers apart +from a nice syntax for procedural programming: `Part II `_ + + +.. _strutils: strutils.html +.. _system: system.html diff --git a/doc/tut2.txt b/doc/tut2.txt new file mode 100644 index 000000000..dc14aabc0 --- /dev/null +++ b/doc/tut2.txt @@ -0,0 +1,718 @@ +============================= +The Nimrod Tutorial (Part II) +============================= + +:Author: Andreas Rumpf +:Version: |nimrodversion| + +.. contents:: + + +Introduction +============ + + "With great power comes great responsibility." -- Spider-man + +This document is a tutorial for the advanced constructs of the *Nimrod* +programming language. + + +Pragmas +======= +Pragmas are Nimrod's method to give the compiler additional information/ +commands without introducing a massive number of new keywords. Pragmas are +processed during semantic checking. Pragmas are enclosed in the +special ``{.`` and ``.}`` curly dot brackets. This tutorial does not cover +pragmas. See the `manual `_ or `user guide `_ for +a description of the available pragmas. + + +Object Oriented Programming +=========================== + +While Nimrod's support for object oriented programming (OOP) is minimalistic, +powerful OOP technics can be used. OOP is seen as *one* way to design a +program, not *the only* way. Often a procedural approach leads to simpler +and more efficient code. + + +Objects +------- + +Like tuples, objects are a means to pack different values together in a +structured way. However, objects provide many features that tuples do not: +They provide inheritance and information hiding. Because objects encapsulate +data, the ``()`` tuple constructor cannot be used to construct objects. So +the order of the object's fields is not as important as it is for tuples. The +programmer should provide a proc to initialize the object (this is called +a *constructor*). + +Objects have access to their type at runtime. There is an +``is`` operator that can be used to check the object's type: + +.. code-block:: nimrod + + type + TPerson = object of TObject + name*: string # the * means that `name` is accessible from other modules + age: int # no * means that the field is hidden from other modules + + TStudent = object of TPerson # TStudent inherits from TPerson + id: int # with an id field + + var + student: TStudent + person: TPerson + assert(student is TStudent) # is true + +Object fields that should be visible from outside the defining module, have to +be marked by ``*``. In contrast to tuples, different object types are +never *equivalent*. New object types can only be defined within a type +section. + +Inheritance is done with the ``object of`` syntax. Multiple inheritance is +currently not supported. If an object type has no suitable ancestor, ``TObject`` +should be used as its ancestor, but this is only a convention. + +Note that aggregation (*has-a* relation) is often preferable to inheritance +(*is-a* relation) for simple code reuse. Since objects are value types in +Nimrod, aggregation is as efficient as inheritance. + + +Mutually recursive types +------------------------ + +Objects, tuples and references can model quite complex data structures which +depend on each other. This is called *mutually recursive types*. In Nimrod +these types need to be declared within a single type section. Anything else +would require arbitrary symbol lookahead which slows down compilation. + +Example: + +.. code-block:: nimrod + type + PNode = ref TNode # a traced reference to a TNode + TNode = object + le, ri: PNode # left and right subtrees + sym: ref TSym # leaves contain a reference to a TSym + + TSym = object # a symbol + name: string # the symbol's name + line: int # the line the symbol was declared in + code: PNode # the symbol's abstract syntax tree + + +Type conversions +---------------- +Nimrod distinguishes between `type casts`:idx: and `type conversions`:idx:. +Casts are done with the ``cast`` operator and force the compiler to +interpret a bit pattern to be of another type. + +Type conversions are a much more polite way to convert a type into another: +They preserve the abstract *value*, not necessarily the *bit-pattern*. If a +type conversion is not possible, the compiler complains or an exception is +raised. + +The syntax for type conversions is ``destination_type(expression_to_convert)`` +(like an ordinary call): + +.. code-block:: nimrod + proc getID(x: TPerson): int = + return TStudent(x).id + +The ``EInvalidObjectConversion`` exception is raised if ``x`` is not a +``TStudent``. + + +Object variants +--------------- +Often an object hierarchy is overkill in certain situations where simple +`variant`:idx: types are needed. + +An example: + +.. code-block:: nimrod + + # This is an example how an abstract syntax tree could be modelled in Nimrod + type + TNodeKind = enum # the different node types + nkInt, # a leaf with an integer value + nkFloat, # a leaf with a float value + nkString, # a leaf with a string value + nkAdd, # an addition + nkSub, # a subtraction + nkIf # an if statement + PNode = ref TNode + TNode = object + case kind: TNodeKind # the ``kind`` field is the discriminator + of nkInt: intVal: int + of nkFloat: floavVal: float + of nkString: strVal: string + of nkAdd, nkSub: + leftOp, rightOp: PNode + of nkIf: + condition, thenPart, elsePart: PNode + + var + n: PNode + new(n) # creates a new node + n.kind = nkFloat + n.floatVal = 0.0 # valid, because ``n.kind==nkFloat`` + + # the following statement raises an `EInvalidField` exception, because + # n.kind's value does not fit: + n.strVal = "" + +As can been seen from the example, an advantage to an object hierarchy is that +no conversion between different object types is needed. Yet, access to invalid +object fields raises an exception. + + +Methods +------- +In ordinary object oriented languages, procedures (also called *methods*) are +bound to a class. This has disadvantages: + +* Adding a method to a class the programmer has no control over is + impossible or needs ugly workarounds. +* Often it is unclear where the procedure should belong to: Is + ``join`` a string method or an array method? Should the complex + ``vertexCover`` algorithm really be a method of the ``graph`` class? + +Nimrod avoids these problems by not distinguishing between methods and +procedures. Methods are just ordinary procedures. However, there is a special +syntactic sugar for calling procedures: The syntax ``obj.method(args)`` can be +used instead of ``method(obj, args)``. If there are no remaining arguments, the +parentheses can be omitted: ``obj.len`` (instead of ``len(obj)``). + +This `method call syntax`:idx: is not restricted to objects, it can be used +for any type: + +.. code-block:: nimrod + + echo("abc".len) # is the same as echo(len("abc")) + echo("abc".toUpper()) + echo({'a', 'b', 'c'}.card) + stdout.writeln("Hallo") # the same as write(stdout, "Hallo") + +If it gives you warm fuzzy feelings, you can even write ``1.`+`(2)`` instead of +``1 + 2`` and claim that Nimrod is a pure object oriented language. (That +would not even be lying: *pure OO* has no meaning anyway. :-) + + +Properties +---------- +As the above example shows, Nimrod has no need for *get-properties*: +Ordinary get-procedures that are called with the *method call syntax* achieve +the same. But setting a value is different; for this a special setter syntax +is needed: + +.. code-block:: nimrod + + type + TSocket* = object of TObject + FHost: int # cannot be accessed from the outside of the module + # the `F` prefix is a convention to avoid clashes since + # the accessors are named `host` + + proc `host=`*(s: var TSocket, value: int) {.inline.} = + ## setter of hostAddr + s.FHost = value + + proc host*(s: TSocket): int {.inline.} = + ## getter of hostAddr + return s.FHost + + var + s: TSocket + s.host = 34 # same as `host=`(s, 34) + +(The example also shows ``inline`` procedures.) + + +The ``[]`` array access operator can be overloaded to provide +`array properties`:idx:\ : + +.. code-block:: nimrod + type + TVector* = object + x, y, z: float + + proc `[]=`* (v: var TVector, i: int, value: float) = + # setter + case i + of 0: v.x = value + of 1: v.y = value + of 2: v.z = value + else: assert(false) + + proc `[]`* (v: TVector, i: int): float = + # getter + case i + of 0: result = v.x + of 1: result = v.y + of 2: result = v.z + else: assert(false) + +The example is silly, since a vector is better modelled by a tuple which +already provides ``v[]`` access. + + +Dynamic binding +--------------- +In Nimrod procedural types are used to implement dynamic binding. The following +example also shows some more conventions: The ``self`` or ``this`` object +is named ``my`` (because it is shorter than the alternatives), each class +provides a constructor, etc. + +.. code-block:: nimrod + type + TFigure = object of TObject # abstract base class: + draw: proc (my: var TFigure) # concrete classes implement this proc + + proc init(f: var TFigure) = + f.draw = nil + + type + TCircle = object of TFigure + radius: int + + proc drawCircle(my: var TCircle) = echo("o " & $my.radius) + + proc init(my: var TCircle) = + init(TFigure(my)) # call base constructor + my.radius = 5 + my.draw = drawCircle + + type + TRectangle = object of TFigure + width, height: int + + proc drawRectangle(my: var TRectangle) = echo("[]") + + proc init(my: var TRectangle) = + init(TFigure(my)) # call base constructor + my.width = 5 + my.height = 10 + my.draw = drawRectangle + + # now use these classes: + var + r: TRectangle + c: TCircle + init(r) + init(c) + r.draw(r) + c.draw(c) + +The last line shows the syntactical difference between static and dynamic +binding: The ``r.draw(r)`` dynamic call refers to ``r`` twice. This difference +is not necessarily bad. But if you want to eliminate the somewhat redundant +``r``, it can be done by using *closures*: + +.. code-block:: nimrod + type + TFigure = object of TObject # abstract base class: + draw: proc () {.closure.} # concrete classes implement this proc + + proc init(f: var TFigure) = + f.draw = nil + + type + TCircle = object of TFigure + radius: int + + proc init(me: var TCircle) = + init(TFigure(me)) # call base constructor + me.radius = 5 + me.draw = lambda () = + echo("o " & $me.radius) + + type + TRectangle = object of TFigure + width, height: int + + proc init(me: var TRectangle) = + init(TFigure(me)) # call base constructor + me.width = 5 + me.height = 10 + me.draw = lambda () = + echo("[]") + + # now use these classes: + var + r: TRectangle + c: TCircle + init(r) + init(c) + r.draw() + c.draw() + +The example also introduces `lambda`:idx: expressions: A ``lambda`` expression +defines a new proc with the ``closure`` calling convention on the fly. + +`Version 0.7.4: Closures and lambda expressions are not implemented.`:red: + + +Exceptions +========== + +In Nimrod `exceptions`:idx: are objects. By convention, exception types are +prefixed with an 'E', not 'T'. The ``system`` module defines an exception +hierarchy that you should stick to. Reusing an existing exception type is +often better than defining a new exception type: It avoids a proliferation of +types. + +Exceptions should be allocated on the heap because their lifetime is unknown. + +A convention is that exceptions should be raised in *exceptional* cases: +For example, if a file cannot be opened, this should not raise an exception +since this is quite common (the file may have been deleted). + + +Raise statement +--------------- +Raising an exception is done with the ``raise`` statement: + +.. code-block:: nimrod + var + e: ref EOS + new(e) + e.msg = "the request to the OS failed" + raise e + +If the ``raise`` keyword is not followed by an expression, the last exception +is *re-raised*. + + +Try statement +------------- + +The `try`:idx: statement handles exceptions: + +.. code-block:: nimrod + # read the first two lines of a text file that should contain numbers + # and tries to add them + var + f: TFile + if openFile(f, "numbers.txt"): + try: + var a = readLine(f) + var b = readLine(f) + echo("sum: " & $(parseInt(a) + parseInt(b))) + except EOverflow: + echo("overflow!") + except EInvalidValue: + echo("could not convert string to integer") + except EIO: + echo("IO error!") + except: + echo("Unknown exception!") + # reraise the unknown exception: + raise + finally: + closeFile(f) + +The statements after the ``try`` are executed unless an exception is +raised. Then the appropriate ``except`` part is executed. + +The empty ``except`` part is executed if there is an exception that is +not explicitely listed. It is similiar to an ``else`` part in ``if`` +statements. + +If there is a ``finally`` part, it is always executed after the +exception handlers. + +The exception is *consumed* in an ``except`` part. If an exception is not +handled, it is propagated through the call stack. This means that often +the rest of the procedure - that is not within a ``finally`` clause - +is not executed (if an exception occurs). + + +Generics +======== + +`Version 0.7.4: Complex generic types like in the example do not work.`:red: + +`Generics`:idx: are Nimrod's means to parametrize procs, iterators or types +with `type parameters`:idx:. They are most useful for efficient type safe +containers: + +.. code-block:: nimrod + type + TBinaryTree[T] = object # TBinaryTree is a generic type with + # with generic param ``T`` + le, ri: ref TBinaryTree[T] # left and right subtrees; may be nil + data: T # the data stored in a node + PBinaryTree*[T] = ref TBinaryTree[T] # type that is exported + + proc newNode*[T](data: T): PBinaryTree[T] = + # constructor for a node + new(result) + result.dat = data + + proc add*[T](root: var PBinaryTree[T], n: PBinaryTree[T]) = + # insert a node into the tree + if root == nil: + root = n + else: + var it = root + while it != nil: + # compare the data items; uses the generic ``cmd`` proc that works for + # any type that has a ``==`` and ``<`` operator + var c = cmp(it.data, n.data) + if c < 0: + if it.le == nil: + it.le = n + return + it = it.le + else: + if it.ri == nil: + it.ri = n + return + it = it.ri + + proc add*[T](root: var PBinaryTree[T], data: T) = + # convenience proc: + add(root, newNode(data)) + + iterator preorder*[T](root: PBinaryTree[T]): T = + # Preorder traversal of a binary tree. + # Since recursive iterators are not yet implemented, + # this uses an explicit stack (which is more efficient anyway): + var stack: seq[PBinaryTree[T]] = @[root] + while stack.len > 0: + var n = stack[stack.len-1] + setLen(stack, stack.len-1) # pop `n` of the stack + while n != nil: + yield n + add(stack, n.ri) # push right subtree onto the stack + n = n.le # and follow the left pointer + + var + root: PBinaryTree[string] # instantiate a PBinaryTree with ``string`` + add(root, newNode("hallo")) # instantiates generic procs ``newNode`` and ``add`` + add(root, "world") # instantiates the second ``add`` proc + for str in preorder(root): + stdout.writeln(str) + +The example shows a generic binary tree. Depending on context, the brackets are +used either to introduce type parameters or to instantiate a generic proc, +iterator or type. As the example shows, generics work with overloading: The +best match of ``add`` is used. The built-in ``add`` procedure for sequences +is not hidden and used in the ``preorder`` iterator. + + +Templates +========= + +Templates are a simple substitution mechanism that operates on Nimrod's +abstract syntax trees. Templates are processed in the semantic pass of the +compiler. They integrate well with the rest of the language and share none +of C's preprocessor macros flaws. However, they may lead to code that is harder +to understand and maintain. So one should use them sparingly. + +To *invoke* a template, call it like a procedure. + +Example: + +.. code-block:: nimrod + template `!=` (a, b: expr): expr = + # this definition exists in the System module + not (a == b) + + assert(5 != 6) # the compiler rewrites that to: assert(not (5 == 6)) + +The ``!=``, ``>``, ``>=``, ``in``, ``notin``, ``isnot`` operators are in fact +templates: This has the benefit that if you overload the ``==`` operator, +the ``!=`` operator is available automatically and does the right thing. + +``a > b`` is transformed into ``b < a``. +``a in b`` is transformed into ``contains(b, a)``. +``notin`` and ``isnot`` have the obvious meanings. + +Templates are especially useful for lazy evaluation purposes. Consider a +simple proc for logging: + +.. code-block:: nimrod + const + debug = True + + proc log(msg: string) {.inline.} = + if debug: + stdout.writeln(msg) + + var + x = 4 + log("x has the value: " & $x) + +This code has a shortcoming: If ``debug`` is set to false someday, the quite +expensive ``$`` and ``&`` operations are still performed! (The argument +evaluation for procedures is said to be *eager*). + +Turning the ``log`` proc into a template solves this problem in an elegant way: + +.. code-block:: nimrod + const + debug = True + + template log(msg: expr): stmt = + if debug: + stdout.writeln(msg) + + var + x = 4 + log("x has the value: " & $x) + +The "types" of templates can be the symbols ``expr`` (stands for *expression*), +``stmt`` (stands for *statement*) or ``typedesc`` (stands for *type +description*). These are no real types, they just help the compiler parsing. + +The template body does not open a new scope. To open a new scope +use a ``block`` statement: + +.. code-block:: nimrod + template declareInScope(x: expr, t: typeDesc): stmt = + var x: t + + template declareInNewScope(x: expr, t: typeDesc): stmt = + # open a new scope: + block: + var x: t + + declareInScope(a, int) + a = 42 # works, `a` is known here + + declareInNewScope(b, int) + b = 42 # does not work, `b` is unknown + + +Macros +====== + +If the template mechanism scares you, you will be pleased to hear that +templates are not really necessary: Macros can do anything that templates can +do and much more. Macros are harder to write than templates and even harder +to get right :-). Now that you have been warned, lets see what a macro *is*. + +Macros enable advanced compile-time code tranformations, but they +cannot change Nimrod's syntax. However, this is no real restriction because +Nimrod's syntax is flexible enough anyway. + +`Macros`:idx: can be used to implement `domain specific languages`:idx:. + +To write macros, one needs to know how the Nimrod concrete syntax is converted +to an abstract syntax tree (AST). (Unfortunately the AST is not documented yet.) + +There are two ways to invoke a macro: +(1) invoking a macro like a procedure call (`expression macros`:idx:) +(2) invoking a macro with the special ``macrostmt`` syntax (`statement macros`:idx:) + + +Expression Macros +----------------- + +The following example implements a powerful ``debug`` command that accepts a +variable number of arguments (this cannot be done with templates): + +.. code-block:: nimrod + # to work with Nimrod syntax trees, we need an API that is defined in the + # ``macros`` module: + import macros + + macro debug(n: expr): stmt = + # `n` is a Nimrod AST that contains the whole macro expression + # this macro returns a list of statements: + result = newNimNode(nnkStmtList, n) + # iterate over any argument that is passed to this macro: + for i in 1..n.len-1: + # add a call to the statement list that writes the expression; + # `toStrLit` converts an AST to its string representation: + result.add(newCall("write", newIdentNode("stdout"), toStrLit(n[i]))) + # add a call to the statement list that writes ": " + result.add(newCall("write", newIdentNode("stdout"), newStrLitNode(": "))) + # add a call to the statement list that writes the expressions value: + result.add(newCall("writeln", newIdentNode("stdout"), n[i])) + + var + a: array[0..10, int] + x = "some string" + a[0] = 42 + a[1] = 45 + + debug(a[0], a[1], x) + +The macro call expands to: + +.. code-block:: nimrod + write(stdout, "a[0]") + write(stdout, ": ") + writeln(stdout, a[0]) + + write(stdout, "a[1]") + write(stdout, ": ") + writeln(stdout, a[1]) + + write(stdout, "x") + write(stdout, ": ") + writeln(stdout, x) + + +Lets return to the dynamic binding ``r.draw(r)`` notational "problem". Apart +from closures, there is another "solution": Define an infix ``!`` macro +operator which hides it: + +.. code-block:: + + macro `!` (n: expr): expr = + result = newNimNode(nnkCall, n) + var dot = newNimNode(nnkDotExpr, n) + dot.add(n[1]) # obj + if n[2].kind == nnkCall: + # transforms ``obj!method(arg1, arg2, ...)`` to + # ``(obj.method)(obj, arg1, arg2, ...)`` + dot.add(n[2][0]) # method + result.add(dot) + result.add(n[1]) # obj + for i in 1..n[2].len-1: + result.add(n[2][i]) + else: + # transforms ``obj!method`` to + # ``(obj.method)(obj)`` + dot.add(n[2]) # method + result.add(dot) + result.add(n[1]) # obj + + r!draw(a, b, c) # will be transfomed into ``r.draw(r, a, b, c)`` + +Great! 20 lines of complex code to safe a few keystrokes! Obviously, this is +exactly you should not do! (But it makes a cool example.) + + +Statement Macros +---------------- + +Statement macros are defined just as expression macros. However, they are +invoked by an expression following a colon. + +The following example outlines a macro that generates a lexical analyser from +regular expressions: + +.. code-block:: nimrod + + macro case_token(n: stmt): stmt = + # creates a lexical analyser from regular expressions + # ... (implementation is an exercise for the reader :-) + nil + + case_token: # this colon tells the parser it is a macro statement + of r"[A-Za-z_]+[A-Za-z_0-9]*": + return tkIdentifier + of r"0-9+": + return tkInteger + of r"[\+\-\*\?]+": + return tkOperator + else: + return tkUnknown + + diff --git a/doc/tutorial.txt b/doc/tutorial.txt deleted file mode 100644 index 795fc0d90..000000000 --- a/doc/tutorial.txt +++ /dev/null @@ -1,215 +0,0 @@ -=========================================== -Tutorial of the Nimrod Programming Language -=========================================== - -:Author: Andreas Rumpf - -Motivation -========== - -Why yet another programming language? - -Look at the trends behind all the new programming languages: - -* They try to be dynamic: Dynamic typing, dynamic method binding, etc. - In my opinion the most things the dynamic features buy could be achieved - with static means in a more efficient and *understandable* way. - -* They depend on big runtime environments which you need to - ship with your program as each new version of these may break compability - in subtle ways or you use recently added features - thus forcing your - users to update their runtime environment. Compiled programs where the - executable contains all needed code are simply the better solution. - -* They are unsuitable for systems programming: Do you really want to - write an operating system, a device driver or an interpreter in a language - that is just-in-time compiled (or interpreted)? - - -So what lacks are *good* systems programming languages. Nimrod is such a -language. It offers the following features: - -* It is readable: It reads from left to right (unlike the C-syntax - languages). -* It is strongly and statically typed: This enables the compiler to find - more errors. Static typing also makes programs more *readable*. -* It is compiled. (Currently this is done via compilation to C.) -* It is garbage collected. Big systems need garbage collection. Manuell - memory management is also supported through *untraced pointers*. -* It scales because high level features are also available: It has built-in - bit sets, strings, enumerations, objects, arrays and dynamically resizeable - arrays (called *sequences*). -* It has high performance: The current implementation compiles to C - and uses a Deutsch-Bobrow garbage collector together with Christoper's - partial mark-sweep garbage collector leading to excellent execution - speed and a small memory footprint. -* It has real modules with proper interfaces and supports separate - compilation. -* It is portable: It compiles to C and platform specific features have - been separated and documented. So even if your platform is not supported - porting should be easy. -* It is flexible: Although primilarily a procedural language, generic, - functional and object-oriented programming is also supported. -* It is easy to learn, easy to use and leads to elegant programs. -* You can link an embedded debugger to your program (ENDB). ENDB is - very easy to use - there is no need to clutter your code with - ``echo`` statements for proper debugging. - - -Introduction -============ - -This document is a tutorial for the programming language *Nimrod*. It should -be a readable quick tour through the language instead of a dry specification -(which can be found `here `_). This tutorial assumes that -the reader already knows some other programming language such as Pascal. Thus -it is detailed in cases where Nimrod differs from other programming languages -and kept short where Nimrod is more or less the same. - - -A quick tour through the language -================================= - -The first program ------------------ - -We start the tour with a modified "hallo world" program: - -.. code-block:: Nimrod - # This is a comment - # Standard IO-routines are always accessible - write(stdout, "What's your name? ") - var name: string = readLine(stdin) - write(stdout, "Hi, " & name & "!\n") - - -Save this code to the file "greeting.nim". Now compile and run it:: - - nimrod compile --run greeting.nim - -As you see, with the ``--run`` switch Nimrod executes the file automatically -after compilation. You can even give your program command line arguments by -appending them after the filename that is to be compiled and run:: - - nimrod compile --run greeting.nim arg1 arg2 - -Though it should be pretty obvious what the program does, I will explain the -syntax: Statements which are not indented are executed when the program -starts. Indentation is Nimrod's way of grouping statements. String literals -are enclosed in double quotes. The ``var`` statement declares a new variable -named ``name`` of type ``string`` with the value that is returned by the -``readline`` procedure. Since the compiler knows that ``readline`` returns -a string, you can leave out the type in the declaration. So this will work too: - -.. code-block:: Nimrod - var name = readline(stdin) - -Note that this is the only form of type inference that exists in Nimrod: -This is because it yields a good compromise between brevity and readability. - -The ``&`` operator concates strings together. ``\n`` stands for the -new line character(s). On several operating systems ``\n`` is represented by -*two* characters: Linefeed and Carriage Return. That is why -*character literals* cannot contain ``\n``. But since Nimrod handles strings -so well, this is a nonissue. - -The "hallo world" program contains several identifiers that are already -known to the compiler: ``write``, ``stdout``, ``readLine``, etc. These -built-in items are declared in the system_ module which is implicitly -imported by any other module. - - -Lexical elements ----------------- - -Let us look into Nimrod's lexical elements in more detail: Like other -programming languages Nimrod consists of identifiers, keywords, comments, -operators, and other punctation marks. Case is *insignificant* in Nimrod and -even underscores are ignored: ``This_is_an_identifier`` and this is the same -identifier ``ThisIsAnIdentifier``. This feature enables one to use other -peoples code without bothering about a naming convention that one does not -like. - -String literals are enclosed in double quotes, character literals in single -quotes. There exist also *raw* string and character literals: - -.. code-block:: Nimrod - r"C:\program files\nim" - -In raw literals the backslash is not an escape character, so they fit -the principle *what you see is what you get*. *Long string literals* -are also available (``""" ... """``); they can span over multiple lines -and the ``\`` is not an escape character either. They are very useful -for embedding SQL code templates for example. - -Comments start with ``#`` and run till the end of the line. (Well this is not -quite true, but you should read the manual for a proper explanation.) - -... XXX number literals - - -The usual statements - if, while, for, case -------------------------------------------- - -In Nimrod indentation is used to group statements. -An example showing the most common statement types: - -.. code-block:: Nimrod - var name = readLine(stdin) - - if name == "Andreas": - echo("What a nice name!") - elif name == "": - echo("Don't you have a name?") - else: - echo("Boring name...") - - for i in 0..length(name)-1: - if name[i] == 'm': - echo("hey, there is an *m* in your name!") - - echo("Please give your password: \n") - var pw = readLine(stdin) - - while pw != "12345": - echo("Wrong password! Next try: \n") - pw = readLine(stdin) - - echo("""Login complete! - What do you want to do? - delete-everything - restart-computer - go-for-a-walk - """) - - case readline(stdin) - of "delete-everything", "restart-computer": - echo("permission denied") - of "go-for-a-walk": echo("please yourself") - else: echo("unknown command") - - -.. - Types - ----- - - Nimrod has a rich type system. This tutorial only gives a few examples. Read - the `manual `_ for further information: - - .. code-block:: Nimrod - type - TMyRecord = object - x, y: int - - - Procedures - ---------- - - Procedures are subroutines. They are declared in this way: - - .. code-block:: Nimrod - proc findSubStr(sub: string, - - -.. _strutils: strutils.html -.. _system: system.html diff --git a/install.sh b/install.sh deleted file mode 100644 index eb592da84..000000000 --- a/install.sh +++ /dev/null @@ -1,126 +0,0 @@ -#! /bin/sh -# -# Nimrod installation script -# (c) 2008 Andreas Rumpf -# - -if [ $# -eq 1 ] ; then - - if test -f bin/nimrod - then - echo "Nimrod already built -- skipping this phase" - else - echo "building Nimrod..." - sh ./build.sh || exit 1 - echo "...done" - fi - - case $1 in - "/usr/bin") - configdir=/etc - libdir=/usr/lib/nimrod - mkdir -p /usr/lib/nimrod - mkdir -p /usr/share/nimrod/doc - - cp bin/nimrod /usr/bin/nimrod - cp config/nimdoc.cfg /etc/nimdoc.cfg - cp -r -p lib /usr/lib/nimrod - cp -r -p doc /usr/share/nimrod/doc - ;; - "/usr/local/bin") - configdir=/etc - libdir=/usr/local/lib/nimrod - mkdir -p /usr/local/lib/nimrod - mkdir -p /usr/local/share/nimrod/doc - - cp bin/nimrod /usr/local/bin/nimrod - cp config/nimdoc.cfg /etc/nimdoc.cfg - cp -r -p lib /usr/local/lib/nimrod - cp -r -p doc /usr/local/share/nimrod/doc - ;; - *) - configdir="$1/nimrod/config" - libdir="$1/nimrod/lib" - mkdir -p $1/nimrod - mkdir -p $1/nimrod/bin - mkdir -p $1/nimrod/config - mkdir -p $1/nimrod/lib - mkdir -p $1/nimrod/doc - - cp bin/nimrod $1/nimrod/bin/nimrod - cp config/nimdoc.cfg $1/nimrod/config/nimdoc.cfg - cp -r -p lib $1/nimrod - cp -r -p doc $1/nimrod - ;; - esac - # write the configuration file - cat >$configdir/nimrod.cfg < (treated like '/opt')" - echo "To deinstall, use the command:" - echo "sh deinstall.sh DIR" - exit 1 -fi diff --git a/install.txt b/install.txt index c6059882a..568c54282 100644 --- a/install.txt +++ b/install.txt @@ -1,66 +1,66 @@ -Installation -============ - - -Installation on Linux/UNIX --------------------------- - -Note: - A C compiler is required - knowledge of C is not! - -The GNU C Compiler is fully supported, other compilers may work. The C compiler -should be in your ``$PATH`` (most likely the case). Note that some few Linux -distributions do not ship with a GCC compiler preinstalled - then you have to -install it. - -Install Nimrod by downloading the appropriate ``.zip`` file and extracting it -to a directory of your choice. The Nimrod Compiler will stay in this -directory (unless you copy it somewhere else). The compiler does not need -write access to its directory anymore, so copying the nimrod folder to ``/opt`` -does work. - -Then run the following command:: - - sh build.sh - -Unlike other software, Nimrod does not distribute its files over the whole file -hierarchy. This has the advantage that you can deinstall it by just deleting -its folder. The disadvantage is that you have to add it to your ``PATH`` -manually. An alternative is to create a symbolic link in ``/usr/bin``:: - - [sudo] ln -s $your_install_dir/bin/nimrod /usr/bin/nimrod - - -Installation on the Macintosh ------------------------------ - -Only MacOS X is supported. -Since MacOS X is UNIX based too, it works like the installation on Linux. You -need to install Apple's developer's tools for the GNU Compiler Collection -though. - - -Installation on Windows ------------------------ - -Install Nimrod by downloading and running -the ``nimrod_$version.exe`` file. As default, the ``LLVM-GCC`` -compiler is used that is bundled with this installer. You can change -the configuration file to use another C compiler. - -Currently, the following C compilers are supported under Windows: - -- | Microsoft's Visual C++ - | http://msdn.microsoft.com/visualc - | (You need the SDK too - but not the full one: Essential are only - the win32api header files and import libraries.) -- | Gnu C Compiler (the mingw version; the cygwin version has not been tested!) - | http://www.mingw.org/download.shtml -- | LLVM with GNU C/C++ frontend - | http://llvm.org/releases/download.html#2.2 -- | Digital Mars C++ - | http://www.digitalmars.com/download/freecompiler.html - -For better compile times I recommend Digital Mars C++ -- it is easy to install -and a small package. - +Installation +============ + + +Installation on Linux/UNIX +-------------------------- + +Note: + A C compiler is required - knowledge of C is not! + +The GNU C Compiler is fully supported, other compilers may work. The C compiler +should be in your ``$PATH`` (most likely the case). Note that some few Linux +distributions do not ship with a GCC compiler preinstalled - then you have to +install it. + +Install Nimrod by downloading the appropriate ``.zip`` file and extracting it +to a directory of your choice. The Nimrod Compiler will stay in this +directory (unless you copy it somewhere else). The compiler does not need +write access to its directory anymore, so copying the nimrod folder to ``/opt`` +does work. + +Then run the following command:: + + sh build.sh + +Unlike other software, Nimrod does not distribute its files over the whole file +hierarchy. This has the advantage that you can deinstall it by just deleting +its folder. The disadvantage is that you have to add it to your ``PATH`` +manually. An alternative is to create a symbolic link in ``/usr/bin``:: + + [sudo] ln -s $your_install_dir/bin/nimrod /usr/bin/nimrod + + +Installation on the Macintosh +----------------------------- + +Only MacOS X is supported. +Since MacOS X is UNIX based too, it works like the installation on Linux. You +need to install Apple's developer's tools for the GNU Compiler Collection +though. + + +Installation on Windows +----------------------- + +Install Nimrod by downloading and running +the ``nimrod_$version.exe`` file. As default, the ``LLVM-GCC`` +compiler is used that is bundled with this installer. You can change +the configuration file to use another C compiler. + +Currently, the following C compilers are supported under Windows: + +- | Microsoft's Visual C++ + | http://msdn.microsoft.com/visualc + | (You need the SDK too - but not the full one: Essential are only + the win32api header files and import libraries.) +- | Gnu C Compiler (the mingw version; the cygwin version has not been tested!) + | http://www.mingw.org/download.shtml +- | LLVM with GNU C/C++ frontend + | http://llvm.org/releases/download.html#2.2 +- | Digital Mars C++ + | http://www.digitalmars.com/download/freecompiler.html + +For better compile times I recommend Digital Mars C++ -- it is easy to install +and a small package. + diff --git a/koch.py b/koch.py index 1f5ae0d2c..974fdec04 100644 --- a/koch.py +++ b/koch.py @@ -18,7 +18,7 @@ False = 0 == 1 # --------------------- constants ---------------------------------------- -NIMROD_VERSION = '0.7.2' +NIMROD_VERSION = '0.7.4' # This string contains Nimrod's version. It is the only place # where the version needs to be updated. The rest is done by # the build process automatically. It is replaced **everywhere** @@ -35,8 +35,6 @@ force = False GENERATE_DIFF = False # if set, a diff.log file is generated when bootstrapping -# this uses quite a good amount of RAM (ca. 12 MB), so it should not be done -# on underpowered systems. USE_FPC = True @@ -45,31 +43,6 @@ BOOTCMD = "%s cc --compile:build/platdef.c %s rod/nimrod.nim" # -------------------------------------------------------------------------- -DOC = split("""endb intern lib manual nimrodc steps overview""") -SRCDOC = split("""system os strutils base/regexprs math complex times - parseopt hashes strtabs lexbase parsecfg base/dialogs - posix/posix - streams base/odbcsql - base/zip/zipfiles base/zip/zlib base/zip/libzip - """) - -ADD_SRCDOC = split(""" - base/cairo/cairo base/cairo/cairoft - base/cairo/cairowin32 base/cairo/cairoxlib - base/gtk/atk base/gtk/gdk2 base/gtk/gdk2pixbuf - base/gtk/gdkglext base/gtk/glib2 base/gtk/gtk2 - base/gtk/gtkglext base/gtk/gtkhtml base/gtk/libglade2 - base/gtk/pango base/gtk/pangoutils - windows/windows windows/mmsystem windows/nb30 - windows/ole2 windows/shellapi windows/shfolder - base/x11/*.nim - base/opengl/*.nim - base/sdl/*.nim - base/lua/*.nim - """) - -# -------------------------------------------------------------------------- - def Error(msg): sys.exit("[Koch] *** ERROR: " + msg) def Warn(msg): print "[Koch] *** WARNING: " + msg def Echo(msg): print "[Koch] " + msg @@ -140,7 +113,7 @@ BaseDir = _baseDir def Path(a): # Gets a UNIX like path and converts it to a path on this platform. # With UNIX like, I mean: slashes, not backslashes, only relative - # paths ('../etc' can be used) + # paths ('../etc') can be used result = a if os.sep != "/": result = replace(result, "/", os.sep) if os.pardir != "..": result = replace(result, "..", os.pardir) @@ -401,12 +374,12 @@ Options: Possible Commands: nim builds the Pascal version of Nimrod rod [options] builds the Nimrod version of Nimrod (with options) - doc builds the documentation in HTML clean cleans Nimrod project; removes generated files boot [options] bootstraps with given command line options rodsrc generates Nimrod version from Pascal version web generates the website profile profile the Nimrod compiler + csource build the C sources for installation zip build the installation ZIP package inno build the Inno Setup installer """ % (NIMROD_VERSION + ' ' * (44-len(NIMROD_VERSION)), sys.version) @@ -436,7 +409,6 @@ def main(args): cmd = args[i] if cmd == "rod": cmd_rod(join(args[i+1:])) elif cmd == "nim": cmd_nim() - elif cmd == "doc": cmd_doc() elif cmd == "clean": cmd_clean() elif cmd == "boot": cmd_boot(join(args[i+1:])) elif cmd == "rodsrc": cmd_rodsrc() @@ -444,11 +416,14 @@ def main(args): elif cmd == "profile": cmd_profile() elif cmd == "zip": cmd_zip() elif cmd == "inno": cmd_inno() + elif cmd == "csource": cmd_csource() else: Error("illegal command: " + cmd) - -def cmd_zip(): + +def cmd_csource(): Exec("nimrod cc -r tools/niminst --var:version=%s csource rod/nimrod" % NIMROD_VERSION) + +def cmd_zip(): Exec("nimrod cc -r tools/niminst --var:version=%s zip rod/nimrod" % NIMROD_VERSION) @@ -586,50 +561,10 @@ def cmd_profile(): # ------------------ web ------------------------------------------------------ -def buildDoc(destPath): - # call nim for the documentation: - for d in DOC: - Exec("nimrod rst2html --putenv:nimrodversion=%s -o:%s/%s.html " - "--index=%s/theindex doc/%s" % - (NIMROD_VERSION, destPath, d, destPath, d)) - for d in SRCDOC: - Exec("nimrod doc --putenv:nimrodversion=%s -o:%s/%s.html " - "--index=%s/theindex lib/%s" % - (NIMROD_VERSION, destPath, FilenameNoExt(d), destPath, d)) - Exec("nimrod rst2html -o:%s/theindex.html %s/theindex" % (destPath, destPath)) - -def buildAddDoc(destPath): - # build additional documentation (without the index): - def build(d): - c = Changed("web__"+d, ["lib/"+d+".nim"], EXPLAIN) - if c.check() or force: - Exec("nimrod doc --putenv:nimrodversion=%s -o:%s/%s.html " - " lib/%s" % (NIMROD_VERSION, destPath, FilenameNoExt(d), d)) - c.success() - - for a in ADD_SRCDOC: - if '*' in a: - for d in Glob("lib/" + a): build(d) - else: - build(a) - def cmd_web(): Exec("nimrod cc -r tools/nimweb.nim web/nimrod --putenv:nimrodversion=%s" % NIMROD_VERSION) -# ------------------ doc ------------------------------------------------------ - -def cmd_doc(): - c = Changed("doc", ["koch.py"] + - Glob("doc/*.txt") + Glob("lib/*.txt") + Glob("lib/*.nim")+ - Glob("config/*.cfg"), - EXPLAIN) - if c.check() or force: - cmd_nim() # we need Nimrod for processing the documentation - buildDoc("doc") - if Exists("doc/overview.html"): - c.success() - # ----------------------------------------------------------------------------- def getVersion(): diff --git a/lib/arithm.nim b/lib/arithm.nim index 5c8b5726c..b307daba3 100644 --- a/lib/arithm.nim +++ b/lib/arithm.nim @@ -102,51 +102,16 @@ proc absInt(a: int): int {.compilerProc, inline.} = raiseOverflow() const - asmVersion = defined(I386) and (defined(vcc) or defined(wcc) or defined(dmc)) + asmVersion = defined(I386) and (defined(vcc) or defined(wcc) or + defined(dmc) or defined(gcc) or defined(llvm_gcc)) # my Version of Borland C++Builder does not have # tasm32, which is needed for assembler blocks # this is why Borland is not included in the 'when' - useInline = not asmVersion -when asmVersion and defined(gcc): - proc addInt(a, b: int): int {.compilerProc, pure, inline.} - proc subInt(a, b: int): int {.compilerProc, pure, inline.} - proc mulInt(a, b: int): int {.compilerProc, pure, inline.} - proc divInt(a, b: int): int {.compilerProc, pure, inline.} - proc modInt(a, b: int): int {.compilerProc, pure, inline.} - proc negInt(a: int): int {.compilerProc, pure, inline.} - -elif asmVersion: - proc addInt(a, b: int): int {.compilerProc, pure.} - proc subInt(a, b: int): int {.compilerProc, pure.} - proc mulInt(a, b: int): int {.compilerProc, pure.} - proc divInt(a, b: int): int {.compilerProc, pure.} - proc modInt(a, b: int): int {.compilerProc, pure.} - proc negInt(a: int): int {.compilerProc, pure.} - -elif useInline: - proc addInt(a, b: int): int {.compilerProc, inline.} - proc subInt(a, b: int): int {.compilerProc, inline.} - proc mulInt(a, b: int): int {.compilerProc.} - # mulInt is to large for inlining? - proc divInt(a, b: int): int {.compilerProc, inline.} - proc modInt(a, b: int): int {.compilerProc, inline.} - proc negInt(a: int): int {.compilerProc, inline.} - -else: - proc addInt(a, b: int): int {.compilerProc.} - proc subInt(a, b: int): int {.compilerProc.} - proc mulInt(a, b: int): int {.compilerProc.} - proc divInt(a, b: int): int {.compilerProc.} - proc modInt(a, b: int): int {.compilerProc.} - proc negInt(a: int): int {.compilerProc.} - -# implementation: - -when asmVersion and not defined(gcc): +when asmVersion and not defined(gcc) and not defined(llvm_gcc): # assembler optimized versions for compilers that # have an intel syntax assembler: - proc addInt(a, b: int): int = + proc addInt(a, b: int): int {.compilerProc, pure.} = # a in eax, and b in edx asm """ mov eax, `a` @@ -156,7 +121,7 @@ when asmVersion and not defined(gcc): theEnd: """ - proc subInt(a, b: int): int = + proc subInt(a, b: int): int {.compilerProc, pure.} = asm """ mov eax, `a` sub eax, `b` @@ -165,7 +130,7 @@ when asmVersion and not defined(gcc): theEnd: """ - proc negInt(a: int): int = + proc negInt(a: int): int {.compilerProc, pure.} = asm """ mov eax, `a` neg eax @@ -174,7 +139,7 @@ when asmVersion and not defined(gcc): theEnd: """ - proc divInt(a, b: int): int = + proc divInt(a, b: int): int {.compilerProc, pure.} = asm """ mov eax, `a` mov ecx, `b` @@ -185,7 +150,7 @@ when asmVersion and not defined(gcc): theEnd: """ - proc modInt(a, b: int): int = + proc modInt(a, b: int): int {.compilerProc, pure.} = asm """ mov eax, `a` mov ecx, `b` @@ -197,7 +162,7 @@ when asmVersion and not defined(gcc): mov eax, edx """ - proc mulInt(a, b: int): int = + proc mulInt(a, b: int): int {.compilerProc, pure.} = asm """ mov eax, `a` mov ecx, `b` @@ -208,99 +173,105 @@ when asmVersion and not defined(gcc): theEnd: """ -elif asmVersion and defined(gcc): - proc addInt(a, b: int): int = - asm """ "addl %1,%%eax\n" +elif false: # asmVersion and (defined(gcc) or defined(llvm_gcc)): + proc addInt(a, b: int): int {.compilerProc, inline.} = + # don't use a pure proc here! + asm """ + "addl %%ecx, %%eax\n" + "jno 1\n" + "call _raiseOverflow\n" + "1: \n" + :"=a"(`result`) + :"a"(`a`), "c"(`b`) + """ + + proc subInt(a, b: int): int {.compilerProc, inline.} = + asm """ "subl %%ecx,%%eax\n" + "jno 1\n" + "call _raiseOverflow\n" + "1: \n" + :"=a"(`result`) + :"a"(`a`), "c"(`b`) + """ + + proc mulInt(a, b: int): int {.compilerProc, inline.} = + asm """ "xorl %%edx, %%edx\n" + "imull %%ecx\n" "jno 1\n" "call _raiseOverflow\n" "1: \n" - :"=a"(`a`) - :"a"(`a`), "r"(`b`) + :"=a"(`result`) + :"a"(`a`), "c"(`b`) + :"%edx" """ - proc subInt(a, b: int): int = - asm """ "subl %1,%%eax\n" - "jno 1\n" - "call _raiseOverflow\n" - "1: \n" - :"=a"(`a`) - :"a"(`a`), "r"(`b`) + proc negInt(a: int): int {.compilerProc, inline.} = + asm """ "negl %%eax\n" + "jno 1\n" + "call _raiseOverflow\n" + "1: \n" + :"=a"(`result`) + :"a"(`a`) """ - proc negInt(a: int): int = - asm """ "negl %%eax\n" - "jno 1\n" - "call _raiseOverflow\n" - "1: \n" - :"=a"(`a`) - :"a"(`a`) - """ - - proc divInt(a, b: int): int = + proc divInt(a, b: int): int {.compilerProc, inline.} = asm """ "xorl %%edx, %%edx\n" "idivl %%ecx\n" "jno 1\n" "call _raiseOverflow\n" "1: \n" - :"=a"(`a`) - :"a"(`a`), "c"(`b`) - :"%edx" + :"=a"(`result`) + :"a"(`a`), "c"(`b`) + :"%edx" """ - proc modInt(a, b: int): int = + proc modInt(a, b: int): int {.compilerProc, inline.} = asm """ "xorl %%edx, %%edx\n" "idivl %%ecx\n" "jno 1\n" "call _raiseOverflow\n" "1: \n" "movl %%edx, %%eax" - :"=a"(`a`) - :"a"(`a`), "c"(`b`) - :"%edx" + :"=a"(`result`) + :"a"(`a`), "c"(`b`) + :"%edx" """ - proc mulInt(a, b: int): int = - asm """ "xorl %%edx, %%edx\n" - "imull %%ecx\n" - "jno 1\n" - "call _raiseOverflow\n" - "1: \n" - :"=a"(`a`) - :"a"(`a`), "c"(`b`) - :"%edx" - """ - -else: - # Platform independant versions of the above (slower!) - - proc addInt(a, b: int): int = +# Platform independant versions of the above (slower!) +when not defined(addInt): + proc addInt(a, b: int): int {.compilerProc, inline.} = result = a +% b if (result xor a) >= 0 or (result xor b) >= 0: return result raiseOverflow() - proc subInt(a, b: int): int = +when not defined(subInt): + proc subInt(a, b: int): int {.compilerProc, inline.} = result = a -% b if (result xor a) >= 0 or (result xor not b) >= 0: return result raiseOverflow() - proc negInt(a: int): int = +when not defined(negInt): + proc negInt(a: int): int {.compilerProc, inline.} = if a != low(int): return -a raiseOverflow() - proc divInt(a, b: int): int = +when not defined(divInt): + proc divInt(a, b: int): int {.compilerProc, inline.} = if b == 0: raiseDivByZero() if a == low(int) and b == -1: raiseOverflow() return a div b - proc modInt(a, b: int): int = +when not defined(modInt): + proc modInt(a, b: int): int {.compilerProc, inline.} = if b == 0: raiseDivByZero() return a mod b +when not defined(mulInt): # # This code has been inspired by Python's source code. # The native int product x*y is either exactly right or *way* off, being @@ -321,7 +292,7 @@ else: # the only one that can lose catastrophic amounts of information, it's the # native int product that must have overflowed. # - proc mulInt(a, b: int): int = + proc mulInt(a, b: int): int {.compilerProc.} = var resAsFloat, floatProd: float diff --git a/lib/base/cgi.nim b/lib/base/cgi.nim index 3ed94c9b7..59b7b9d09 100644 --- a/lib/base/cgi.nim +++ b/lib/base/cgi.nim @@ -281,7 +281,7 @@ proc getServerSoftware*(): string = proc setTestData*(keysvalues: openarray[string]) = ## fills the appropriate environment variables to test your CGI application. - ## This can only simulate the 'GET' 'REQUEST_METHOD'. `keysvalues` should + ## This can only simulate the 'GET' request method. `keysvalues` should ## provide embedded (name, value)-pairs. Example: ## ## .. code-block:: Nimrod @@ -300,6 +300,7 @@ proc setTestData*(keysvalues: openarray[string]) = proc writeContentType*() = ## call this before starting to send your HTML data to `stdout`. This ## is just a shorthand for: + ## ## .. code-block:: Nimrod ## write(stdout, "Content-type: text/html\n\n") write(stdout, "Content-type: text/html\n\n") diff --git a/lib/base/gtk/atk.nim b/lib/base/gtk/atk.nim index 8004eccfc..ae7a34c4b 100644 --- a/lib/base/gtk/atk.nim +++ b/lib/base/gtk/atk.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + import glib2 diff --git a/lib/base/gtk/gdk2.nim b/lib/base/gtk/gdk2.nim index 66838ab99..0ca5056b5 100644 --- a/lib/base/gtk/gdk2.nim +++ b/lib/base/gtk/gdk2.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + import glib2, gdk2pixbuf, pango diff --git a/lib/base/gtk/gdk2pixbuf.nim b/lib/base/gtk/gdk2pixbuf.nim index 8ef3ac0f9..daaa1479b 100644 --- a/lib/base/gtk/gdk2pixbuf.nim +++ b/lib/base/gtk/gdk2pixbuf.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + import glib2 diff --git a/lib/base/gtk/gdkglext.nim b/lib/base/gtk/gdkglext.nim index d5e6b128e..524b5f730 100644 --- a/lib/base/gtk/gdkglext.nim +++ b/lib/base/gtk/gdkglext.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + import Glib2, Gdk2 diff --git a/lib/base/gtk/glib2.nim b/lib/base/gtk/glib2.nim index dfcc586da..aca1b5551 100644 --- a/lib/base/gtk/glib2.nim +++ b/lib/base/gtk/glib2.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + when defined(windows): const gliblib = "libglib-2.0-0.dll" diff --git a/lib/base/gtk/gtk2.nim b/lib/base/gtk/gtk2.nim index 22bbd3c6c..b20d5e635 100644 --- a/lib/base/gtk/gtk2.nim +++ b/lib/base/gtk/gtk2.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + import glib2, atk, pango, gdk2pixbuf, gdk2 diff --git a/lib/base/gtk/gtkglext.nim b/lib/base/gtk/gtkglext.nim index 7d9e35b13..38da5d25e 100644 --- a/lib/base/gtk/gtkglext.nim +++ b/lib/base/gtk/gtkglext.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + import Glib2, Gdk2, Gtk2, GdkGLExt diff --git a/lib/base/gtk/gtkhtml.nim b/lib/base/gtk/gtkhtml.nim index 17d3ac56c..d015a78bc 100644 --- a/lib/base/gtk/gtkhtml.nim +++ b/lib/base/gtk/gtkhtml.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + import gtk2, glib2, atk, pango, gdk2pixbuf, gdk2 diff --git a/lib/base/gtk/libglade2.nim b/lib/base/gtk/libglade2.nim index cc90b0623..5e323680e 100644 --- a/lib/base/gtk/libglade2.nim +++ b/lib/base/gtk/libglade2.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + import glib2, gtk2 diff --git a/lib/base/gtk/pango.nim b/lib/base/gtk/pango.nim index 363650f1f..ade2da989 100644 --- a/lib/base/gtk/pango.nim +++ b/lib/base/gtk/pango.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + import glib2 diff --git a/lib/base/gtk/pangoutils.nim b/lib/base/gtk/pangoutils.nim index 6033cca7d..e6f3ab94c 100644 --- a/lib/base/gtk/pangoutils.nim +++ b/lib/base/gtk/pangoutils.nim @@ -1,3 +1,5 @@ +{.deadCodeElim: on.} + import glib2, pango diff --git a/lib/base/sdl/sdl.nim b/lib/base/sdl/sdl.nim index 2c83c4893..7d2b6ba26 100644 --- a/lib/base/sdl/sdl.nim +++ b/lib/base/sdl/sdl.nim @@ -270,7 +270,8 @@ # # -# +{.deadCodeElim: on.} + when defined(windows): const SDLLibName = "SDL.dll" elif defined(macosx): diff --git a/lib/base/sdl/sdl_mixer.nim b/lib/base/sdl/sdl_mixer.nim index b5dd91dfa..f840dc52a 100644 --- a/lib/base/sdl/sdl_mixer.nim +++ b/lib/base/sdl/sdl_mixer.nim @@ -2,93 +2,93 @@ #****************************************************************************** # # $Id: sdl_mixer.pas,v 1.18 2007/05/29 21:31:44 savage Exp $ -# # -# -# Borland Delphi SDL_Mixer - Simple DirectMedia Layer Mixer Library -# Conversion of the Simple DirectMedia Layer Headers -# -# Portions created by Sam Lantinga are -# Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga -# 5635-34 Springhouse Dr. -# Pleasanton, CA 94588 (USA) -# -# All Rights Reserved. -# -# The original files are : SDL_mixer.h -# music_cmd.h -# wavestream.h -# timidity.h -# playmidi.h -# music_ogg.h -# mikmod.h -# -# The initial developer of this Pascal code was : -# Dominqiue Louis -# -# Portions created by Dominqiue Louis are -# Copyright (C) 2000 - 2001 Dominqiue Louis. -# -# -# Contributor(s) -# -------------- -# Matthias Thoma -# -# Obtained through: -# Joint Endeavour of Delphi Innovators ( Project JEDI ) -# -# You may retrieve the latest version of this file at the Project -# JEDI home page, located at http://delphi-jedi.org -# -# The contents of this file are used with permission, subject to -# the Mozilla Public License Version 1.1 (the "License"); you may -# not use this file except in compliance with the License. You may -# obtain a copy of the License at -# http://www.mozilla.org/MPL/MPL-1.1.html -# -# Software distributed under the License is distributed on an -# "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -# implied. See the License for the specific language governing -# rights and limitations under the License. -# -# Description -# ----------- -# -# -# -# -# -# -# -# Requires -# -------- -# SDL.pas & SMPEG.pas somewhere within your search path. -# -# Programming Notes -# ----------------- -# See the Aliens Demo to see how this library is used -# -# Revision History -# ---------------- -# April 02 2001 - DL : Initial Translation -# -# February 02 2002 - DL : Update to version 1.2.1 -# -# April 03 2003 - DL : Added jedi-sdl.inc include file to support more -# Pascal compilers. Initial support is now included -# for GnuPascal, VirtualPascal, TMT and obviously -# continue support for Delphi Kylix and FreePascal. -# +# +# +# Borland Delphi SDL_Mixer - Simple DirectMedia Layer Mixer Library +# Conversion of the Simple DirectMedia Layer Headers +# +# Portions created by Sam Lantinga are +# Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga +# 5635-34 Springhouse Dr. +# Pleasanton, CA 94588 (USA) +# +# All Rights Reserved. +# +# The original files are : SDL_mixer.h +# music_cmd.h +# wavestream.h +# timidity.h +# playmidi.h +# music_ogg.h +# mikmod.h +# +# The initial developer of this Pascal code was : +# Dominqiue Louis +# +# Portions created by Dominqiue Louis are +# Copyright (C) 2000 - 2001 Dominqiue Louis. +# +# +# Contributor(s) +# -------------- +# Matthias Thoma +# +# Obtained through: +# Joint Endeavour of Delphi Innovators ( Project JEDI ) +# +# You may retrieve the latest version of this file at the Project +# JEDI home page, located at http://delphi-jedi.org +# +# The contents of this file are used with permission, subject to +# the Mozilla Public License Version 1.1 (the "License"); you may +# not use this file except in compliance with the License. You may +# obtain a copy of the License at +# http://www.mozilla.org/MPL/MPL-1.1.html +# +# Software distributed under the License is distributed on an +# "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# Description +# ----------- +# +# +# +# +# +# +# +# Requires +# -------- +# SDL.pas & SMPEG.pas somewhere within your search path. +# +# Programming Notes +# ----------------- +# See the Aliens Demo to see how this library is used +# +# Revision History +# ---------------- +# April 02 2001 - DL : Initial Translation +# +# February 02 2002 - DL : Update to version 1.2.1 +# +# April 03 2003 - DL : Added jedi-sdl.inc include file to support more +# Pascal compilers. Initial support is now included +# for GnuPascal, VirtualPascal, TMT and obviously +# continue support for Delphi Kylix and FreePascal. +# # April 24 2003 - DL : under instruction from Alexey Barkovoy, I have added -# better TMT Pascal support and under instruction +# better TMT Pascal support and under instruction # from Prof. Abimbola Olowofoyeku (The African Chief), -# I have added better Gnu Pascal support -# -# April 30 2003 - DL : under instruction from David Mears AKA -# Jason Siletto, I have added FPC Linux support. -# This was compiled with fpc 1.1, so remember to set -# include file path. ie. -Fi/usr/share/fpcsrc/rtl/* -# +# I have added better Gnu Pascal support +# +# April 30 2003 - DL : under instruction from David Mears AKA +# Jason Siletto, I have added FPC Linux support. +# This was compiled with fpc 1.1, so remember to set +# include file path. ie. -Fi/usr/share/fpcsrc/rtl/* +# # # $Log: sdl_mixer.pas,v $ # Revision 1.18 2007/05/29 21:31:44 savage @@ -166,19 +166,19 @@ const MIX_MAJOR_VERSION* = SDL_MIXER_MAJOR_VERSION MIX_MINOR_VERSION* = SDL_MIXER_MINOR_VERSION MIX_PATCHLEVEL* = SDL_MIXER_PATCHLEVEL # SDL_Mixer.h constants - # The default mixer has 8 simultaneous mixing channels - MIX_CHANNELS* = 8 # Good default values for a PC soundcard + # The default mixer has 8 simultaneous mixing channels + MIX_CHANNELS* = 8 # Good default values for a PC soundcard MIX_DEFAULT_FREQUENCY* = 22050 -when defined(IA32): - const +when defined(IA32): + const MIX_DEFAULT_FORMAT* = AUDIO_S16LSB -else: - const +else: + const MIX_DEFAULT_FORMAT* = AUDIO_S16MSB -const +const MIX_DEFAULT_CHANNELS* = 2 - MIX_MAX_VOLUME* = 128 # Volume of a chunk + MIX_MAX_VOLUME* = 128 # Volume of a chunk PATH_MAX* = 255 # mikmod.h constants #* # * Library version @@ -204,7 +204,7 @@ type #music_cmd.h types cvt*: TSDL_AudioCVT PMidiEvent* = ptr TMidiEvent - TMidiEvent*{.final.} = object + TMidiEvent*{.final.} = object time*: int32 channel*: uint8 type_*: uint8 @@ -228,43 +228,43 @@ type #music_cmd.h types len_available*: int snd_available*: PUint8 - TErrorEnum* = enum - MMERR_OPENING_FILE, MMERR_OUT_OF_MEMORY, MMERR_DYNAMIC_LINKING, - MMERR_SAMPLE_TOO_BIG, MMERR_OUT_OF_HANDLES, MMERR_UNKNOWN_WAVE_TYPE, - MMERR_LOADING_PATTERN, MMERR_LOADING_TRACK, MMERR_LOADING_HEADER, - MMERR_LOADING_SAMPLEINFO, MMERR_NOT_A_MODULE, MMERR_NOT_A_STREAM, - MMERR_MED_SYNTHSAMPLES, MMERR_ITPACK_INVALID_DATA, MMERR_DETECTING_DEVICE, - MMERR_INVALID_DEVICE, MMERR_INITIALIZING_MIXER, MMERR_OPENING_AUDIO, - MMERR_8BIT_ONLY, MMERR_16BIT_ONLY, MMERR_STEREO_ONLY, MMERR_ULAW, - MMERR_NON_BLOCK, MMERR_AF_AUDIO_PORT, MMERR_AIX_CONFIG_INIT, - MMERR_AIX_CONFIG_CONTROL, MMERR_AIX_CONFIG_START, MMERR_GUS_SETTINGS, - MMERR_GUS_RESET, MMERR_GUS_TIMER, MMERR_HP_SETSAMPLESIZE, MMERR_HP_SETSPEED, - MMERR_HP_CHANNELS, MMERR_HP_AUDIO_OUTPUT, MMERR_HP_AUDIO_DESC, - MMERR_HP_BUFFERSIZE, MMERR_OSS_SETFRAGMENT, MMERR_OSS_SETSAMPLESIZE, - MMERR_OSS_SETSTEREO, MMERR_OSS_SETSPEED, MMERR_SGI_SPEED, MMERR_SGI_16BIT, - MMERR_SGI_8BIT, MMERR_SGI_STEREO, MMERR_SGI_MONO, MMERR_SUN_INIT, - MMERR_OS2_MIXSETUP, MMERR_OS2_SEMAPHORE, MMERR_OS2_TIMER, MMERR_OS2_THREAD, - MMERR_DS_PRIORITY, MMERR_DS_BUFFER, MMERR_DS_FORMAT, MMERR_DS_NOTIFY, - MMERR_DS_EVENT, MMERR_DS_THREAD, MMERR_DS_UPDATE, MMERR_WINMM_HANDLE, - MMERR_WINMM_ALLOCATED, MMERR_WINMM_DEVICEID, MMERR_WINMM_FORMAT, + TErrorEnum* = enum + MMERR_OPENING_FILE, MMERR_OUT_OF_MEMORY, MMERR_DYNAMIC_LINKING, + MMERR_SAMPLE_TOO_BIG, MMERR_OUT_OF_HANDLES, MMERR_UNKNOWN_WAVE_TYPE, + MMERR_LOADING_PATTERN, MMERR_LOADING_TRACK, MMERR_LOADING_HEADER, + MMERR_LOADING_SAMPLEINFO, MMERR_NOT_A_MODULE, MMERR_NOT_A_STREAM, + MMERR_MED_SYNTHSAMPLES, MMERR_ITPACK_INVALID_DATA, MMERR_DETECTING_DEVICE, + MMERR_INVALID_DEVICE, MMERR_INITIALIZING_MIXER, MMERR_OPENING_AUDIO, + MMERR_8BIT_ONLY, MMERR_16BIT_ONLY, MMERR_STEREO_ONLY, MMERR_ULAW, + MMERR_NON_BLOCK, MMERR_AF_AUDIO_PORT, MMERR_AIX_CONFIG_INIT, + MMERR_AIX_CONFIG_CONTROL, MMERR_AIX_CONFIG_START, MMERR_GUS_SETTINGS, + MMERR_GUS_RESET, MMERR_GUS_TIMER, MMERR_HP_SETSAMPLESIZE, MMERR_HP_SETSPEED, + MMERR_HP_CHANNELS, MMERR_HP_AUDIO_OUTPUT, MMERR_HP_AUDIO_DESC, + MMERR_HP_BUFFERSIZE, MMERR_OSS_SETFRAGMENT, MMERR_OSS_SETSAMPLESIZE, + MMERR_OSS_SETSTEREO, MMERR_OSS_SETSPEED, MMERR_SGI_SPEED, MMERR_SGI_16BIT, + MMERR_SGI_8BIT, MMERR_SGI_STEREO, MMERR_SGI_MONO, MMERR_SUN_INIT, + MMERR_OS2_MIXSETUP, MMERR_OS2_SEMAPHORE, MMERR_OS2_TIMER, MMERR_OS2_THREAD, + MMERR_DS_PRIORITY, MMERR_DS_BUFFER, MMERR_DS_FORMAT, MMERR_DS_NOTIFY, + MMERR_DS_EVENT, MMERR_DS_THREAD, MMERR_DS_UPDATE, MMERR_WINMM_HANDLE, + MMERR_WINMM_ALLOCATED, MMERR_WINMM_DEVICEID, MMERR_WINMM_FORMAT, MMERR_WINMM_UNKNOWN, MMERR_MAC_SPEED, MMERR_MAC_START, MMERR_MAX PMODULE* = ptr TMODULE - TMODULE*{.final.} = object + TMODULE*{.final.} = object PUNIMOD* = ptr TUNIMOD TUNIMOD* = TMODULE #SDL_mixer.h types - # The internal format for an audio chunk + # The internal format for an audio chunk PMix_Chunk* = ptr TMix_Chunk - TMix_Chunk*{.final.} = object + TMix_Chunk*{.final.} = object allocated*: int abuf*: PUint8 alen*: Uint32 - volume*: Uint8 # Per-sample volume, 0-128 - - Mix_Chunk* = TMix_Chunk # The different fading types supported - TMix_Fading* = enum + volume*: Uint8 # Per-sample volume, 0-128 + + Mix_Chunk* = TMix_Chunk # The different fading types supported + TMix_Fading* = enum MIX_NO_FADING, MIX_FADING_OUT, MIX_FADING_IN Mix_Fading* = TMix_Fading - TMix_MusicType* = enum + TMix_MusicType* = enum MUS_NONE, MUS_CMD, MUS_WAV, MUS_MOD, MUS_MID, MUS_OGG, MUS_MP3 Mix_MusicType* = TMix_MusicType # # TMusicUnion = record @@ -279,89 +279,84 @@ type #music_cmd.h types # {$ENDIF} # end; PMix_Music* = ptr TMix_Music - TMix_Music*{.final.} = object # The internal format for a music chunk interpreted via mikmod + TMix_Music*{.final.} = object # The internal format for a music chunk interpreted via mikmod type_*: TMix_MusicType # other fields are not aviable # data : TMusicUnion; # fading : TMix_Fading; # fade_volume : integer; # fade_step : integer; # fade_steps : integer; - # error : integer; - + # error : integer; + TMixFunction* = proc (udata: Pointer, stream: PUint8, length: int): Pointer{. cdecl.} # This macro can be used to fill a version structure with the compile-time - # version of the SDL_mixer library. + # version of the SDL_mixer library. proc SDL_MIXER_VERSION*(X: var TSDL_Version) # This function gets the version of the dynamically linked SDL_mixer library. # It should NOT be used to fill a version structure, instead you should use the - # SDL_MIXER_VERSION() macro. + # SDL_MIXER_VERSION() macro. proc Mix_Linked_Version*(): PSDL_version{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Open the mixer with a certain audio format -proc Mix_OpenAudio*(frequency: int, format: Uint16, channels: int, + # Open the mixer with a certain audio format +proc Mix_OpenAudio*(frequency: int, format: Uint16, channels: int, chunksize: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # Dynamically change the number of channels managed by the mixer. # If decreasing the number of channels, the upper channels are # stopped. # This function returns the new number of allocated channels. - # -proc Mix_AllocateChannels*(numchannels: int): int{.cdecl, + # +proc Mix_AllocateChannels*(numchannels: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # Find out what the actual audio device parameters are. # This function returns 1 if the audio has been opened, 0 otherwise. - # + # proc Mix_QuerySpec*(frequency: var int, format: var Uint16, channels: var int): int{. cdecl, importc, dynlib: SDL_MixerLibName.} - # Load a wave file or a music (.mod .s3m .it .xm) file -proc Mix_LoadWAV_RW*(src: PSDL_RWops, freesrc: int): PMix_Chunk{.cdecl, + # Load a wave file or a music (.mod .s3m .it .xm) file +proc Mix_LoadWAV_RW*(src: PSDL_RWops, freesrc: int): PMix_Chunk{.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_LoadWAV*(filename: cstring): PMix_Chunk -proc Mix_LoadMUS*(filename: cstring): PMix_Music{.cdecl, +proc Mix_LoadMUS*(filename: cstring): PMix_Music{.cdecl, importc, dynlib: SDL_MixerLibName.} - ##if 0 { This hasn't been hooked into music.c yet } - #{ Load a music file from an SDL_RWop object (MikMod-specific currently) - # Matt Campbell (matt@campbellhome.dhs.org) April 2000 } - #function Mix_LoadMUS_RW(SDL_RWops *rw) : PMix_Music; cdecl; - ##endif - # Load a wave file of the mixer format from a memory buffer -proc Mix_QuickLoad_WAV*(mem: PUint8): PMix_Chunk{.cdecl, + # Load a wave file of the mixer format from a memory buffer +proc Mix_QuickLoad_WAV*(mem: PUint8): PMix_Chunk{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Free an audio chunk previously loaded + # Free an audio chunk previously loaded proc Mix_FreeChunk*(chunk: PMix_Chunk){.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_FreeMusic*(music: PMix_Music){.cdecl, importc, dynlib: SDL_MixerLibName.} # Find out the music format of a mixer music, or the currently playing # music, if 'music' is NULL. -proc Mix_GetMusicType*(music: PMix_Music): TMix_MusicType{.cdecl, +proc Mix_GetMusicType*(music: PMix_Music): TMix_MusicType{.cdecl, importc, dynlib: SDL_MixerLibName.} # Set a function that is called after all mixing is performed. # This can be used to provide real-time visual display of the audio stream # or add a custom mixer filter for the stream data. # -proc Mix_SetPostMix*(mix_func: TMixFunction, arg: Pointer){.cdecl, +proc Mix_SetPostMix*(mix_func: TMixFunction, arg: Pointer){.cdecl, importc, dynlib: SDL_MixerLibName.} # Add your own music player or additional mixer function. # If 'mix_func' is NULL, the default music player is re-enabled. - # -proc Mix_HookMusic*(mix_func: TMixFunction, arg: Pointer){.cdecl, + # +proc Mix_HookMusic*(mix_func: TMixFunction, arg: Pointer){.cdecl, importc, dynlib: SDL_MixerLibName.} # Add your own callback when the music has finished playing. - # -proc Mix_HookMusicFinished*(music_finished: Pointer){.cdecl, + # +proc Mix_HookMusicFinished*(music_finished: Pointer){.cdecl, importc, dynlib: SDL_MixerLibName.} - # Get a pointer to the user data for the current music hook + # Get a pointer to the user data for the current music hook proc Mix_GetMusicHookData*(): Pointer{.cdecl, importc, dynlib: SDL_MixerLibName.} #* Add your own callback when a channel has finished playing. NULL # * to disable callback.* -type +type TChannel_finished* = proc (channel: int){.cdecl.} -proc Mix_ChannelFinished*(channel_finished: TChannel_finished){.cdecl, +proc Mix_ChannelFinished*(channel_finished: TChannel_finished){.cdecl, importc, dynlib: SDL_MixerLibName.} -const +const MIX_CHANNEL_POST* = - 2 # This is the format of a special effect callback: # myeffect(int chan, void *stream, int len, void *udata); - # + # # (chan) is the channel number that your effect is affecting. (stream) is # the buffer of data to work upon. (len) is the size of (stream), and # (udata) is a user-defined bit of data, which you pass as the last arg of @@ -372,10 +367,10 @@ const # down the mixing pipeline, through any other effect functions, then finally # to be mixed with the rest of the channels and music for the final output # stream. - # + # -type - TMix_EffectFunc* = proc (chan: int, stream: Pointer, length: int, +type + TMix_EffectFunc* = proc (chan: int, stream: Pointer, length: int, udata: Pointer): Pointer{.cdecl.} # * This is a callback that signifies that a channel has finished all its # * loops and has completed playback. This gets called if the buffer @@ -428,7 +423,7 @@ type # * Error messages can be retrieved from Mix_GetError(). # * -proc Mix_RegisterEffect*(chan: int, f: TMix_EffectFunc, d: TMix_EffectDone, +proc Mix_RegisterEffect*(chan: int, f: TMix_EffectFunc, d: TMix_EffectDone, arg: Pointer): int{.cdecl, importc, dynlib: SDL_MixerLibName.} #* You may not need to call this explicitly, unless you need to stop an # * effect from processing in the middle of a chunk's playback. @@ -438,7 +433,7 @@ proc Mix_RegisterEffect*(chan: int, f: TMix_EffectFunc, d: TMix_EffectDone, # * returns zero if error (no such channel or effect), nonzero if removed. # * Error messages can be retrieved from Mix_GetError(). # * -proc Mix_UnregisterEffect*(channel: int, f: TMix_EffectFunc): int{.cdecl, +proc Mix_UnregisterEffect*(channel: int, f: TMix_EffectFunc): int{.cdecl, importc, dynlib: SDL_MixerLibName.} #* You may not need to call this explicitly, unless you need to stop all # * effects from processing in the middle of a chunk's playback. Note that @@ -451,17 +446,17 @@ proc Mix_UnregisterEffect*(channel: int, f: TMix_EffectFunc): int{.cdecl, # * returns zero if error( no such channel ), nonzero if all effects removed. # * Error messages can be retrieved from Mix_GetError( ). # * -proc Mix_UnregisterAllEffects*(channel: int): int{.cdecl, +proc Mix_UnregisterAllEffects*(channel: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} -const - MIX_EFFECTSMAXSPEED* = "MIX_EFFECTSMAXSPEED" +const + MIX_EFFECTSMAXSPEED* = "MIX_EFFECTSMAXSPEED" # * These are the internally - defined mixing effects.They use the same API that # * effects defined in the application use, but are provided here as a # * convenience.Some effects can reduce their quality or use more memory in # * the name of speed; to enable this, make sure the environment variable # * MIX_EFFECTSMAXSPEED( see above ) is defined before you call # * Mix_OpenAudio( ). - # * + # * #* set the panning of a channel.The left and right channels are specified # * as integers between 0 and 255, quietest to loudest, respectively. # * @@ -486,9 +481,9 @@ const # * nonzero if panning effect enabled.Note that an audio device in mono # * mode is a no - op, but this call will return successful in that case . # * Error messages can be retrieved from Mix_GetError( ). - # * + # * -proc Mix_SetPanning*(channel: int, left: Uint8, right: Uint8): int{.cdecl, +proc Mix_SetPanning*(channel: int, left: Uint8, right: Uint8): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # * set the position ofa channel.( angle ) is an integer from 0 to 360, that # * specifies the location of the sound in relation to the listener.( angle ) @@ -526,8 +521,8 @@ proc Mix_SetPanning*(channel: int, left: Uint8, right: Uint8): int{.cdecl, # * returns zero if error( no such channel or Mix_RegisterEffect( )fails ), # * nonzero if position effect is enabled. # * Error messages can be retrieved from Mix_GetError( ). - # * -proc Mix_SetPosition*(channel: int, angle: Sint16, distance: Uint8): int{.cdecl, + # * +proc Mix_SetPosition*(channel: int, angle: Sint16, distance: Uint8): int{.cdecl, importc, dynlib: SDL_MixerLibName.} #* set the "distance" of a channel.( distance ) is an integer from 0 to 255 # * that specifies the location of the sound in relation to the listener. @@ -555,8 +550,8 @@ proc Mix_SetPosition*(channel: int, angle: Sint16, distance: Uint8): int{.cdecl, # * returns zero if error( no such channel or Mix_RegisterEffect( )fails ), # * nonzero if position effect is enabled. # * Error messages can be retrieved from Mix_GetError( ). - # * -proc Mix_SetDistance*(channel: int, distance: Uint8): int{.cdecl, + # * +proc Mix_SetDistance*(channel: int, distance: Uint8): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # * # * !!! FIXME : Haven't implemented, since the effect goes past the @@ -600,39 +595,39 @@ proc Mix_SetDistance*(channel: int, distance: Uint8): int{.cdecl, # * nonzero if reversing effect is enabled.Note that an audio device in mono # * mode is a no - op, but this call will return successful in that case . # * Error messages can be retrieved from Mix_GetError( ). - # * -proc Mix_SetReverseStereo*(channel: int, flip: int): int{.cdecl, + # * +proc Mix_SetReverseStereo*(channel: int, flip: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # end of effects API. - -ryan. * # Reserve the first channels (0 -> n-1) for the application, i.e. don't allocate # them dynamically to the next sample if requested with a -1 value below. # Returns the number of reserved channels. - # + # proc Mix_ReserveChannels*(num: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Channel grouping functions + # Channel grouping functions # Attach a tag to a channel. A tag can be assigned to several mixer # channels, to form groups of channels. # If 'tag' is -1, the tag is removed (actually -1 is the tag used to # represent the group of all the channels). # Returns true if everything was OK. - # -proc Mix_GroupChannel*(which: int, tag: int): int{.cdecl, + # +proc Mix_GroupChannel*(which: int, tag: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Assign several consecutive channels to a group -proc Mix_GroupChannels*(`from`: int, `to`: int, tag: int): int{.cdecl, + # Assign several consecutive channels to a group +proc Mix_GroupChannels*(`from`: int, `to`: int, tag: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Finds the first available channel in a group of channels + # Finds the first available channel in a group of channels proc Mix_GroupAvailable*(tag: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # Returns the number of channels in a group. This is also a subtle # way to get the total number of channels when 'tag' is -1 - # + # proc Mix_GroupCount*(tag: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Finds the "oldest" sample playing in a group of channels + # Finds the "oldest" sample playing in a group of channels proc Mix_GroupOldest*(tag: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Finds the "most recent" (i.e. last) sample playing in a group of channels + # Finds the "most recent" (i.e. last) sample playing in a group of channels proc Mix_GroupNewer*(tag: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # The same as above, but the sound is played at most 'ticks' milliseconds -proc Mix_PlayChannelTimed*(channel: int, chunk: PMix_Chunk, loops: int, + # The same as above, but the sound is played at most 'ticks' milliseconds +proc Mix_PlayChannelTimed*(channel: int, chunk: PMix_Chunk, loops: int, ticks: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # Play an audio chunk on a specific channel. # If the specified channel is -1, play on the first free channel. @@ -641,13 +636,13 @@ proc Mix_PlayChannelTimed*(channel: int, chunk: PMix_Chunk, loops: int, # Returns which channel was used to play the sound. # proc Mix_PlayChannel*(channel: int, chunk: PMix_Chunk, loops: int): int -proc Mix_PlayMusic*(music: PMix_Music, loops: int): int{.cdecl, +proc Mix_PlayMusic*(music: PMix_Music, loops: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Fade in music or a channel over "ms" milliseconds, same semantics as the "Play" functions -proc Mix_FadeInMusic*(music: PMix_Music, loops: int, ms: int): int{.cdecl, + # Fade in music or a channel over "ms" milliseconds, same semantics as the "Play" functions +proc Mix_FadeInMusic*(music: PMix_Music, loops: int, ms: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} -proc Mix_FadeInChannelTimed*(channel: int, chunk: PMix_Chunk, loops: int, - ms: int, ticks: int): int{.cdecl, +proc Mix_FadeInChannelTimed*(channel: int, chunk: PMix_Chunk, loops: int, + ms: int, ticks: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_FadeInChannel*(channel: int, chunk: PMix_Chunk, loops: int, ms: int): int # Set the volume in the range of 0-128 of a specific channel or chunk. @@ -655,12 +650,12 @@ proc Mix_FadeInChannel*(channel: int, chunk: PMix_Chunk, loops: int, ms: int): i # Returns the original volume. # If the specified volume is -1, just return the current volume. # -proc Mix_Volume*(channel: int, volume: int): int{.cdecl, +proc Mix_Volume*(channel: int, volume: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} -proc Mix_VolumeChunk*(chunk: PMix_Chunk, volume: int): int{.cdecl, +proc Mix_VolumeChunk*(chunk: PMix_Chunk, volume: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_VolumeMusic*(volume: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Halt playing of a particular channel + # Halt playing of a particular channel proc Mix_HaltChannel*(channel: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_HaltGroup*(tag: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_HaltMusic*(): int{.cdecl, importc, dynlib: SDL_MixerLibName.} @@ -668,25 +663,25 @@ proc Mix_HaltMusic*(): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # The sample will stop playing after the 'ticks' milliseconds have elapsed, # or remove the expiration if 'ticks' is -1 # -proc Mix_ExpireChannel*(channel: int, ticks: int): int{.cdecl, +proc Mix_ExpireChannel*(channel: int, ticks: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # Halt a channel, fading it out progressively till it's silent # The ms parameter indicates the number of milliseconds the fading # will take. - # -proc Mix_FadeOutChannel*(which: int, ms: int): int{.cdecl, + # +proc Mix_FadeOutChannel*(which: int, ms: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_FadeOutGroup*(tag: int, ms: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_FadeOutMusic*(ms: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Query the fading status of a channel + # Query the fading status of a channel proc Mix_FadingMusic*(): TMix_Fading{.cdecl, importc, dynlib: SDL_MixerLibName.} -proc Mix_FadingChannel*(which: int): TMix_Fading{.cdecl, +proc Mix_FadingChannel*(which: int): TMix_Fading{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Pause/Resume a particular channel + # Pause/Resume a particular channel proc Mix_Pause*(channel: int){.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_Resume*(channel: int){.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_Paused*(channel: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Pause/Resume the music stream + # Pause/Resume the music stream proc Mix_PauseMusic*(){.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_ResumeMusic*(){.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_RewindMusic*(){.cdecl, importc, dynlib: SDL_MixerLibName.} @@ -697,16 +692,16 @@ proc Mix_PausedMusic*(): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # order number) and for OGG music (set position in seconds), at the # moment. # -proc Mix_SetMusicPosition*(position: float64): int{.cdecl, +proc Mix_SetMusicPosition*(position: float64): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # Check the status of a specific channel. # If the specified channel is -1, check all channels. # proc Mix_Playing*(channel: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_PlayingMusic*(): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Stop music and set external music playback command + # Stop music and set external music playback command proc Mix_SetMusicCMD*(command: cstring): int{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Synchro value is set by MikMod from modules while playing + # Synchro value is set by MikMod from modules while playing proc Mix_SetSynchroValue*(value: int): int{.cdecl, importc, dynlib: SDL_MixerLibName.} proc Mix_GetSynchroValue*(): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # @@ -714,29 +709,29 @@ proc Mix_GetSynchroValue*(): int{.cdecl, importc, dynlib: SDL_MixerLibName.} # Returns nil if it's an invalid channel, or there's no chunk associated. # proc Mix_GetChunk*(channel: int): PMix_Chunk{.cdecl, importc, dynlib: SDL_MixerLibName.} - # Close the mixer, halting all playing audio + # Close the mixer, halting all playing audio proc Mix_CloseAudio*(){.cdecl, importc, dynlib: SDL_MixerLibName.} - # We'll use SDL for reporting errors + # We'll use SDL for reporting errors proc Mix_SetError*(fmt: cstring) proc Mix_GetError*(): cstring # implementation -proc SDL_MIXER_VERSION(X: var TSDL_version) = +proc SDL_MIXER_VERSION(X: var TSDL_version) = X.major = SDL_MIXER_MAJOR_VERSION X.minor = SDL_MIXER_MINOR_VERSION X.patch = SDL_MIXER_PATCHLEVEL -proc Mix_LoadWAV(filename: cstring): PMix_Chunk = +proc Mix_LoadWAV(filename: cstring): PMix_Chunk = result = Mix_LoadWAV_RW(SDL_RWFromFile(filename, "rb"), 1) -proc Mix_PlayChannel(channel: int, chunk: PMix_Chunk, loops: int): int = +proc Mix_PlayChannel(channel: int, chunk: PMix_Chunk, loops: int): int = result = Mix_PlayChannelTimed(channel, chunk, loops, - 1) -proc Mix_FadeInChannel(channel: int, chunk: PMix_Chunk, loops: int, ms: int): int = +proc Mix_FadeInChannel(channel: int, chunk: PMix_Chunk, loops: int, ms: int): int = result = Mix_FadeInChannelTimed(channel, chunk, loops, ms, - 1) -proc Mix_SetError(fmt: cstring) = +proc Mix_SetError(fmt: cstring) = SDL_SetError(fmt) -proc Mix_GetError(): cstring = +proc Mix_GetError(): cstring = result = SDL_GetError() diff --git a/lib/dyncalls.nim b/lib/dyncalls.nim index 7d7ade26c..6e74a9698 100644 --- a/lib/dyncalls.nim +++ b/lib/dyncalls.nim @@ -126,5 +126,5 @@ elif defined(mac): nss = NSLookupSymbolInModule(NSModule(lib), name) result = TProcAddr(NSAddressOfSymbol(nss)) -else: # workaround a newly introduced bug :-( +else: {.error: "no implementation for dyncalls".} diff --git a/lib/ecmasys.nim b/lib/ecmasys.nim index 2bbbd5f79..e26e763be 100644 --- a/lib/ecmasys.nim +++ b/lib/ecmasys.nim @@ -326,6 +326,9 @@ proc echo*(x: cstring) = ewriteln(x) proc echo[Ty](x: Ty) = echo(x) +proc echo[Ty](x: openArray[Ty]) = + for a in items(x): echo(a) + # Arithmetic: proc addInt(a, b: int): int {.pure, compilerproc.} = asm """ diff --git a/lib/excpt.nim b/lib/excpt.nim index 9c87fab55..be307af09 100644 --- a/lib/excpt.nim +++ b/lib/excpt.nim @@ -61,9 +61,6 @@ type filename: CString len: int # length of slots (when not debugging always zero) - TTempFrame = tuple[ # used for recursion elimination in WriteStackTrace - procname: CString, line: int] - var buf: string # cannot be allocated on the stack! assertBuf: string # we need a different buffer for @@ -72,33 +69,45 @@ var framePtr {.exportc.}: PFrame - tempFrames: array [0..255, TTempFrame] # cannot be allocated - # on the stack! + tempFrames: array [0..127, PFrame] # cannot be allocated on the stack! proc auxWriteStackTrace(f: PFrame, s: var string) = + const + firstCalls = 32 var it = f i = 0 total = 0 - while it != nil and i <= high(tempFrames): - tempFrames[i] = (it.procname, it.line) + while it != nil and i <= high(tempFrames)-(firstCalls-1): + # the (-1) is for a nil entry that marks where the '...' should occur + tempFrames[i] = it inc(i) inc(total) it = it.prev + var b = it while it != nil: inc(total) it = it.prev - # if the buffer overflowed print '...': + for j in 1..total-i-(firstCalls-1): + if b != nil: b = b.prev if total != i: - add(s, "(") - add(s, $(total-i)) - add(s, " calls omitted) ...\n") + tempFrames[i] = nil + inc(i) + while b != nil and i <= high(tempFrames): + tempFrames[i] = b + inc(i) + b = b.prev for j in countdown(i-1, 0): - add(s, $tempFrames[j].procname) - if tempFrames[j].line > 0: - add(s, ", line: ") - add(s, $tempFrames[j].line) - add(s, "\n") + if tempFrames[j] == nil: + add(s, "(") + add(s, $(total-i-1)) + add(s, " calls omitted) ...\n") + else: + add(s, $tempFrames[j].procname) + if tempFrames[j].line > 0: + add(s, ", line: ") + add(s, $tempFrames[j].line) + add(s, "\n") proc rawWriteStackTrace(s: var string) = if framePtr == nil: @@ -156,8 +165,7 @@ proc internalAssert(file: cstring, line: int, cond: bool) {.compilerproc.} = raise gAssertionFailed # newException(EAssertionFailed, assertBuf) proc WriteStackTrace() = - var - s: string = "" + var s = "" rawWriteStackTrace(s) writeToStdErr(s) @@ -208,13 +216,13 @@ assertBuf = newString(2048) setLen(buf, 0) setLen(assertBuf, 0) -proc raiseRangeError(val: biggestInt) {.compilerproc, noreturn.} = +proc raiseRangeError(val: biggestInt) {.compilerproc, noreturn, noinline.} = raise newException(EOutOfRange, "value " & $val & " out of range") -proc raiseIndexError() {.compilerproc, noreturn.} = +proc raiseIndexError() {.compilerproc, noreturn, noinline.} = raise newException(EInvalidIndex, "index out of bounds") -proc raiseFieldError(f: string) {.compilerproc, noreturn.} = +proc raiseFieldError(f: string) {.compilerproc, noreturn, noinline.} = raise newException(EInvalidField, f & " is not accessible") proc chckIndx(i, a, b: int): int = diff --git a/lib/gc.nim b/lib/gc.nim index a103bfc22..e5e8072c5 100644 --- a/lib/gc.nim +++ b/lib/gc.nim @@ -13,11 +13,10 @@ # * incremental # * non-recursive # * generational -# * excellent performance # Future Improvements: # * Both dlmalloc and TLSF lack zero-overhead object allocation. Thus, for -# small objects we will should use our own allocator. +# small objects we should use our own allocator. # * Support for multi-threading. However, locks for the reference counting # might turn out to be too slow. @@ -332,7 +331,7 @@ proc CellSetPut(t: var TCellSet, key: TAddress): PPageDesc = # ---------- slightly higher level procs -------------------------------------- -proc in_Operator(s: TCellSet, cell: PCell): bool = +proc contains(s: TCellSet, cell: PCell): bool = var u = cast[TAddress](cell) var t = CellSetGet(s, u shr PageShift) if t != nil: @@ -468,23 +467,6 @@ proc prepareDealloc(cell: PCell) = proc setStackBottom(theStackBottom: pointer) {.compilerproc.} = stackBottom = theStackBottom -proc initGC() = - when traceGC: - for i in low(TCellState)..high(TCellState): CellSetInit(states[i]) - gch.stackScans = 0 - gch.cycleCollections = 0 - gch.maxThreshold = 0 - gch.maxStackSize = 0 - gch.maxStackPages = 0 - gch.cycleTableSize = 0 - # init the rt - init(gch.zct) - init(gch.tempStack) - CellSetInit(gch.cycleRoots) - CellSetInit(gch.stackCells) - gch.mask = 0 - new(gOutOfMem) # reserve space for the EOutOfMemory exception here! - proc PossibleRoot(gch: var TGcHeap, c: PCell) {.inline.} = if canbeCycleRoot(c): incl(gch.cycleRoots, c) @@ -535,6 +517,23 @@ proc unsureAsgnRef(dest: ppointer, src: pointer) = if dest^ != nil: decRef(usrToCell(dest^)) dest^ = src +proc initGC() = + when traceGC: + for i in low(TCellState)..high(TCellState): CellSetInit(states[i]) + gch.stackScans = 0 + gch.cycleCollections = 0 + gch.maxThreshold = 0 + gch.maxStackSize = 0 + gch.maxStackPages = 0 + gch.cycleTableSize = 0 + # init the rt + init(gch.zct) + init(gch.tempStack) + CellSetInit(gch.cycleRoots) + CellSetInit(gch.stackCells) + gch.mask = 0 + new(gOutOfMem) # reserve space for the EOutOfMemory exception here! + proc getDiscriminant(aa: Pointer, n: ptr TNimNode): int = assert(n.kind == nkCase) var d: int diff --git a/lib/lexbase.nim b/lib/lexbase.nim index ea9a61821..f6861a5b6 100644 --- a/lib/lexbase.nim +++ b/lib/lexbase.nim @@ -151,8 +151,7 @@ proc open(L: var TBaseLexer, input: PStream, bufLen: int = 8192) = skip_UTF_8_BOM(L) proc getColNumber(L: TBaseLexer, pos: int): int = - result = pos - L.lineStart - assert(result >= 0) + result = abs(pos - L.lineStart) proc getCurrentLine(L: TBaseLexer, marker: bool = true): string = var i: int diff --git a/lib/macros.nim b/lib/macros.nim index 809531c4c..f2783b637 100644 --- a/lib/macros.nim +++ b/lib/macros.nim @@ -30,59 +30,59 @@ # if key[-4:] == "Flag": continue # cog.out(toEnum(key, val)) #]]] -type - TNimrodTypeKind* = enum - ntyNone, ntyBool, ntyChar, ntyEmpty, - ntyArrayConstr, ntyNil, ntyGeneric, ntyGenericInst, - ntyGenericParam, ntyEnum, ntyAnyEnum, ntyArray, - ntyObject, ntyTuple, ntySet, ntyRange, - ntyPtr, ntyRef, ntyVar, ntySequence, - ntyProc, ntyPointer, ntyOpenArray, ntyString, - ntyCString, ntyForward, ntyInt, ntyInt8, - ntyInt16, ntyInt32, ntyInt64, ntyFloat, - ntyFloat32, ntyFloat64, ntyFloat128 - TNimTypeKinds* = set[TNimrodTypeKind] - TNimrodSymKind* = enum - nskUnknownSym, nskConditional, nskDynLib, nskParam, - nskTypeParam, nskTemp, nskType, nskConst, - nskVar, nskProc, nskIterator, nskConverter, - nskMacro, nskTemplate, nskField, nskEnumField, - nskForVar, nskModule, nskLabel, nskStub - TNimSymKinds* = set[TNimrodSymKind] - TNimrodNodeKind* = enum - nnkNone, nnkEmpty, nnkIdent, nnkSym, - nnkType, nnkCharLit, nnkIntLit, nnkInt8Lit, - nnkInt16Lit, nnkInt32Lit, nnkInt64Lit, nnkFloatLit, - nnkFloat32Lit, nnkFloat64Lit, nnkStrLit, nnkRStrLit, - nnkTripleStrLit, nnkMetaNode, nnkNilLit, nnkDotCall, - nnkCommand, nnkCall, nnkGenericCall, nnkExplicitTypeListCall, - nnkExprEqExpr, nnkExprColonExpr, nnkIdentDefs, nnkInfix, - nnkPrefix, nnkPostfix, nnkPar, nnkCurly, - nnkBracket, nnkBracketExpr, nnkPragmaExpr, nnkRange, - nnkDotExpr, nnkCheckedFieldExpr, nnkDerefExpr, nnkIfExpr, - nnkElifExpr, nnkElseExpr, nnkLambda, nnkAccQuoted, - nnkHeaderQuoted, nnkTableConstr, nnkQualified, nnkHiddenStdConv, - nnkHiddenSubConv, nnkHiddenCallConv, nnkConv, nnkCast, - nnkAddr, nnkHiddenAddr, nnkHiddenDeref, nnkObjDownConv, - nnkObjUpConv, nnkChckRangeF, nnkChckRange64, nnkChckRange, - nnkStringToCString, nnkCStringToString, nnkPassAsOpenArray, nnkAsgn, - nnkDefaultTypeParam, nnkGenericParams, nnkFormalParams, nnkOfInherit, - nnkModule, nnkProcDef, nnkConverterDef, nnkMacroDef, - nnkTemplateDef, nnkIteratorDef, nnkOfBranch, nnkElifBranch, - nnkExceptBranch, nnkElse, nnkMacroStmt, nnkAsmStmt, - nnkPragma, nnkIfStmt, nnkWhenStmt, nnkForStmt, - nnkWhileStmt, nnkCaseStmt, nnkVarSection, nnkConstSection, - nnkConstDef, nnkTypeSection, nnkTypeDef, nnkYieldStmt, - nnkTryStmt, nnkFinally, nnkRaiseStmt, nnkReturnStmt, - nnkBreakStmt, nnkContinueStmt, nnkBlockStmt, nnkDiscardStmt, - nnkStmtList, nnkImportStmt, nnkFromStmt, nnkImportAs, - nnkIncludeStmt, nnkAccessStmt, nnkCommentStmt, nnkStmtListExpr, - nnkBlockExpr, nnkStmtListType, nnkBlockType, nnkVm, - nnkTypeOfExpr, nnkObjectTy, nnkTupleTy, nnkRecList, - nnkRecCase, nnkRecWhen, nnkRefTy, nnkPtrTy, - nnkVarTy, nnkProcTy, nnkEnumTy, nnkEnumFieldDef, - nnkReturnToken - TNimNodeKinds* = set[TNimrodNodeKind] +type + TNimrodNodeKind* = enum + nnkNone, nnkEmpty, nnkIdent, nnkSym, + nnkType, nnkCharLit, nnkIntLit, nnkInt8Lit, + nnkInt16Lit, nnkInt32Lit, nnkInt64Lit, nnkFloatLit, + nnkFloat32Lit, nnkFloat64Lit, nnkStrLit, nnkRStrLit, + nnkTripleStrLit, nnkMetaNode, nnkNilLit, nnkDotCall, + nnkCommand, nnkCall, nnkGenericCall, nnkExplicitTypeListCall, + nnkExprEqExpr, nnkExprColonExpr, nnkIdentDefs, nnkVarTuple, + nnkInfix, nnkPrefix, nnkPostfix, nnkPar, + nnkCurly, nnkBracket, nnkBracketExpr, nnkPragmaExpr, + nnkRange, nnkDotExpr, nnkCheckedFieldExpr, nnkDerefExpr, + nnkIfExpr, nnkElifExpr, nnkElseExpr, nnkLambda, + nnkAccQuoted, nnkHeaderQuoted, nnkTableConstr, nnkQualified, + nnkHiddenStdConv, nnkHiddenSubConv, nnkHiddenCallConv, nnkConv, + nnkCast, nnkAddr, nnkHiddenAddr, nnkHiddenDeref, + nnkObjDownConv, nnkObjUpConv, nnkChckRangeF, nnkChckRange64, + nnkChckRange, nnkStringToCString, nnkCStringToString, nnkPassAsOpenArray, + nnkAsgn, nnkFastAsgn, nnkDefaultTypeParam, nnkGenericParams, + nnkFormalParams, nnkOfInherit, nnkModule, nnkProcDef, + nnkConverterDef, nnkMacroDef, nnkTemplateDef, nnkIteratorDef, + nnkOfBranch, nnkElifBranch, nnkExceptBranch, nnkElse, + nnkMacroStmt, nnkAsmStmt, nnkPragma, nnkIfStmt, + nnkWhenStmt, nnkForStmt, nnkWhileStmt, nnkCaseStmt, + nnkVarSection, nnkConstSection, nnkConstDef, nnkTypeSection, + nnkTypeDef, nnkYieldStmt, nnkTryStmt, nnkFinally, + nnkRaiseStmt, nnkReturnStmt, nnkBreakStmt, nnkContinueStmt, + nnkBlockStmt, nnkDiscardStmt, nnkStmtList, nnkImportStmt, + nnkFromStmt, nnkImportAs, nnkIncludeStmt, nnkAccessStmt, + nnkCommentStmt, nnkStmtListExpr, nnkBlockExpr, nnkStmtListType, + nnkBlockType, nnkVm, nnkTypeOfExpr, nnkObjectTy, + nnkTupleTy, nnkRecList, nnkRecCase, nnkRecWhen, + nnkRefTy, nnkPtrTy, nnkVarTy, nnkProcTy, + nnkEnumTy, nnkEnumFieldDef, nnkReturnToken + TNimNodeKinds* = set[TNimrodNodeKind] + TNimrodTypeKind* = enum + ntyNone, ntyBool, ntyChar, ntyEmpty, + ntyArrayConstr, ntyNil, ntyGeneric, ntyGenericInst, + ntyGenericParam, ntyEnum, ntyAnyEnum, ntyArray, + ntyObject, ntyTuple, ntySet, ntyRange, + ntyPtr, ntyRef, ntyVar, ntySequence, + ntyProc, ntyPointer, ntyOpenArray, ntyString, + ntyCString, ntyForward, ntyInt, ntyInt8, + ntyInt16, ntyInt32, ntyInt64, ntyFloat, + ntyFloat32, ntyFloat64, ntyFloat128 + TNimTypeKinds* = set[TNimrodTypeKind] + TNimrodSymKind* = enum + nskUnknownSym, nskConditional, nskDynLib, nskParam, + nskTypeParam, nskTemp, nskType, nskConst, + nskVar, nskProc, nskIterator, nskConverter, + nskMacro, nskTemplate, nskField, nskEnumField, + nskForVar, nskModule, nskLabel, nskStub + TNimSymKinds* = set[TNimrodSymKind] #[[[end]]] type diff --git a/lib/nimbase.h b/lib/nimbase.h index f7e41f2b1..378b66278 100644 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -421,18 +421,4 @@ struct NimException { }; #endif -#if 0 -typedef struct TStringDesc { - NI len; - NI space; - NIM_CHAR data[1]; /* SEQ_DECL_SIZE]; */ -} TStringDesc; - -typedef struct { - NI len, space; -} TGenericSeq; - -typedef TGenericSeq* PGenericSeq; -#endif - #endif diff --git a/lib/os.nim b/lib/os.nim index fa53fa3e2..bffc6014c 100644 --- a/lib/os.nim +++ b/lib/os.nim @@ -11,6 +11,7 @@ ## retrieving environment variables, reading command line arguments, ## working with directories, running shell commands, etc. ## This module is -- like any other basic library -- platform independant. +{.deadCodeElim: on.} {.push debugger: off.} @@ -863,9 +864,9 @@ var when defined(windows): # because we support Windows GUI applications, things get really # messy here... - proc GetEnvironmentStringsA*(): cstring {. + proc GetEnvironmentStringsA(): cstring {. stdcall, dynlib: "kernel32", importc.} - proc FreeEnvironmentStringsA*(para1: cstring): int32 {. + proc FreeEnvironmentStringsA(para1: cstring): int32 {. stdcall, dynlib: "kernel32", importc.} proc strEnd(cstr: CString, c = 0): CString {.importc: "strchr", nodecl.} @@ -1091,8 +1092,8 @@ proc expandFilename(filename: string): string = proc parseCmdLine*(c: string): seq[string] = ## Splits a command line into several components; components are separated by - ## whitespace or are quoted with the ``"`` or ``'`` characters. This proc is - ## only occassionally useful, better use the `parseopt` module. + ## whitespace unless the whitespace occurs within ``"`` or ``'`` quotes. + ## This proc is only occassionally useful, better use the `parseopt` module. result = @[] var i = 0 while c[i] != '\0': diff --git a/lib/parsecfg.nim b/lib/parsecfg.nim index a148f3e3a..2508c8bd6 100644 --- a/lib/parsecfg.nim +++ b/lib/parsecfg.nim @@ -54,7 +54,7 @@ type TTokKind = enum tkInvalid, tkEof, tkSymbol, tkEquals, tkColon, tkBracketLe, tkBracketRi, tkDashDash - TToken{.final.} = object # a token + TToken {.final.} = object # a token kind: TTokKind # the type of the token literal: string # the parsed (string) literal @@ -139,7 +139,7 @@ proc getEscapedChar(c: var TCfgParser, tok: var TToken) = inc(c.bufpos) # skip '\' case c.buf[c.bufpos] of 'n', 'N': - tok.literal = tok.literal & nl + add(tok.literal, nl) Inc(c.bufpos) of 'r', 'R', 'c', 'C': add(tok.literal, '\c') diff --git a/lib/parseopt.nim b/lib/parseopt.nim index 243b7497f..1cce0a11e 100644 --- a/lib/parseopt.nim +++ b/lib/parseopt.nim @@ -53,7 +53,7 @@ proc init(cmdline: string = ""): TOptParser = else: result.cmd = "" for i in countup(1, ParamCount()): - result.cmd = result.cmd & quoteIfSpaceExists(paramStr(i)) & ' ' + result.cmd = result.cmd & quoteIfContainsWhite(paramStr(i)) & ' ' result.kind = cmdEnd result.key = "" result.val = "" diff --git a/lib/repr.nim b/lib/repr.nim index 2f29d839d..7f5b0d33c 100644 --- a/lib/repr.nim +++ b/lib/repr.nim @@ -22,12 +22,12 @@ proc reprPointer(x: pointer): string {.compilerproc.} = proc reprStrAux(result: var string, s: string) = if cast[pointer](s) == nil: - add result "nil" + add result, "nil" return add result, reprPointer(cast[pointer](s)) & "\"" for c in items(s): case c - of '"': add result "\\\"" + of '"': add result, "\\\"" of '\\': add result, "\\\\" # BUGFIX: forgotten of '\10': add result, "\\10\"\n\"" # " \n " # better readability of '\128' .. '\255', '\0'..'\9', '\11'..'\31': diff --git a/lib/strutils.nim b/lib/strutils.nim index 7e1a329d6..6189c6a88 100644 --- a/lib/strutils.nim +++ b/lib/strutils.nim @@ -12,6 +12,8 @@ ## All the routines here are avaiable for the EMCAScript target ## too! +{.deadCodeElim: on.} + {.push debugger:off .} # the user does not want to trace a part # of the standard library! @@ -41,19 +43,19 @@ proc strip*(s: string): string {.noSideEffect.} proc toLower*(s: string): string {.noSideEffect.} ## Converts `s` into lower case. This works only for the letters A-Z. - ## See `charsets.nativeToLower` for a version that is locale-dependant. + ## See `unicode.toLower` for a version that works for any Unicode character. proc toLower*(c: Char): Char {.noSideEffect.} ## Converts `c` into lower case. This works only for the letters A-Z. - ## See `charsets.nativeToLower()` for a version that is locale-dependant. + ## See `unicode.toLower` for a version that works for any Unicode character. proc toUpper*(s: string): string {.noSideEffect.} ## Converts `s` into upper case. This works only for the letters a-z. - ## See `charsets.nativeToUpper()` for a version that is locale-dependant. + ## See `unicode.toUpper` for a version that works for any Unicode character. proc toUpper*(c: Char): Char {.noSideEffect.} ## Converts `c` into upper case. This works only for the letters a-z. - ## See `charsets.nativeToUpper()` for a version that is locale-dependant. + ## See `unicode.toUpper` for a version that works for any Unicode character. proc capitalize*(s: string): string {.noSideEffect.} ## Converts the first character of `s` into upper case. @@ -71,6 +73,10 @@ proc findSubStr*(sub: char, s: string, start: int = 0): int {.noSideEffect.} ## Searches for `sub` in `s` starting at position `start`. Searching is ## case-sensitive. If `sub` is not in `s`, -1 is returned. +proc findChars*(chars: set[char], s: string, start: int = 0): int {.noSideEffect.} + ## Searches for `chars` in `s` starting at position `start`. If `s` contains + ## none of the characters in `chars`, -1 is returned. + proc replaceStr*(s, sub, by: string): string {.noSideEffect.} ## Replaces `sub` in `s` by the string `by`. @@ -173,11 +179,14 @@ proc cmpIgnoreStyle*(a, b: string): int {.noSideEffect.} ## | < 0 iff a < b ## | > 0 iff a > b -proc in_Operator*(s: string, c: char): bool {.noSideEffect.} - ## Same as `findSubStr(c, s) >= 0`. +proc contains*(s: string, c: char): bool {.noSideEffect.} + ## Same as ``findSubStr(c, s) >= 0``. -proc in_Operator*(s, sub: string): bool {.noSideEffect.} - ## Same as `findSubStr(sub, s) >= 0`. +proc contains*(s, sub: string): bool {.noSideEffect.} + ## Same as ``findSubStr(sub, s) >= 0``. + +proc contains*(s: string, chars: set[char]): bool {.noSideEffect.} + ## Same as ``findChars(s, chars) >= 0``. proc toHex*(x: BiggestInt, len: int): string {.noSideEffect.} ## Converts `x` to its hexadecimal representation. The resulting string @@ -259,10 +268,10 @@ proc allCharsInSet*(s: string, theSet: TCharSet): bool = if not (c in theSet): return false return true -proc quoteIfSpaceExists*(s: string): string = +proc quoteIfContainsWhite*(s: string): string = ## returns ``'"' & s & '"'`` if `s` contains a space and does not ## start with a quote, else returns `s` - if findSubStr(' ', s) >= 0 and s[0] != '"': + if findChars({' ', '\t'}, s) >= 0 and s[0] != '"': result = '"' & s & '"' else: result = s @@ -488,11 +497,19 @@ proc findSubStr(sub: char, s: string, start: int = 0): int = for i in start..len(s)-1: if sub == s[i]: return i return -1 + +proc findChars(chars: set[char], s: string, start: int = 0): int = + for i in start..s.len-1: + if s[i] in chars: return i + return -1 + +proc contains(s: string, chars: set[char]): bool = + return findChars(chars, s) >= 0 -proc in_Operator(s: string, c: char): bool = +proc contains(s: string, c: char): bool = return findSubStr(c, s) >= 0 -proc in_Operator(s, sub: string): bool = +proc contains(s, sub: string): bool = return findSubStr(sub, s) >= 0 proc replaceStr(s, sub, by: string): string = diff --git a/lib/sysio.nim b/lib/sysio.nim index c178ff559..d79b5e287 100644 --- a/lib/sysio.nim +++ b/lib/sysio.nim @@ -91,10 +91,13 @@ proc writeln[Ty](f: TFile, x: Ty) = write(f, "\n") proc writeln[Ty](f: TFile, x: openArray[Ty]) = - write(f, x) + for i in items(x): write(f, i) write(f, "\n") proc echo[Ty](x: Ty) = writeln(stdout, x) +proc echo[Ty](x: openArray[Ty]) = + for i in items(x): write(stdout, i) + write(stdout, "\n") # interface to the C procs: proc fopen(filename, mode: CString): pointer {.importc: "fopen", noDecl.} diff --git a/lib/sysstr.nim b/lib/sysstr.nim index 921a92ff5..72f50f85a 100644 --- a/lib/sysstr.nim +++ b/lib/sysstr.nim @@ -15,13 +15,6 @@ # we don't use refcounts because that's a behaviour # the programmer may not want -type - # len and space without counting the terminating zero: - NimStringDesc {.compilerproc, final.} = object of TGenericSeq - data: array[0..100_000_000, char] # for the '\0' character - - NimString = ptr NimStringDesc - # implementation: proc resize(old: int): int {.inline.} = diff --git a/lib/system.nim b/lib/system.nim index 97ad7297a..1ac6a8445 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -58,6 +58,17 @@ proc defined*[T] (x: T): bool {.magic: "Defined", noSideEffect.} proc `not` *(x: bool): bool {.magic: "Not", noSideEffect.} ## Boolean not; returns true iff ``x == false``. +proc `and`*(x, y: bool): bool {.magic: "And", noSideEffect.} + ## Boolean ``and``; returns true iff ``x == y == true``. + ## Evaluation is short-circuited: This means that if ``x`` is false, + ## ``y`` will not even be evaluated. +proc `or`*(x, y: bool): bool {.magic: "Or", noSideEffect.} + ## Boolean ``or``; returns true iff ``not (not x and not y)``. + ## Evaluation is short-circuited: This means that if ``x`` is true, + ## ``y`` will not even be evaluated. +proc `xor`*(x, y: bool): bool {.magic: "Xor", noSideEffect.} + ## Boolean `exclusive or`; returns true iff ``x != y``. + proc new*[T](a: var ref T) {.magic: "New".} ## creates a new object of type ``T`` and returns a safe (traced) ## reference to it in ``a``. @@ -94,6 +105,19 @@ type seq*{.magic: "Seq".}[T] ## Generic type to construct sequences. set*{.magic: "Set".}[T] ## Generic type to construct bit sets. +when not defined(EcmaScript) and not defined(NimrodVM): + type + TGenericSeq {.compilerproc, pure.} = object + len, space: int + PGenericSeq {.exportc.} = ptr TGenericSeq + # len and space without counting the terminating zero: + NimStringDesc {.compilerproc, final.} = object of TGenericSeq + data: array[0..100_000_000, char] + NimString = ptr NimStringDesc + + include hti + +type Byte* = Int8 ## this is an alias for ``int8``, that is a signed ## int 8 bits wide. @@ -403,8 +427,8 @@ proc abs*(x: int8): int8 {.magic: "AbsI", noSideEffect.} proc abs*(x: int16): int16 {.magic: "AbsI", noSideEffect.} proc abs*(x: int32): int32 {.magic: "AbsI", noSideEffect.} proc abs*(x: int64): int64 {.magic: "AbsI64", noSideEffect.} - ## returns the absolute value of `x`. If `x` is ``low(x)`` (that is - ## -MININT for its type), an overflow exception is thrown (if overflow + ## returns the absolute value of `x`. If `x` is ``low(x)`` (that + ## is -MININT for its type), an overflow exception is thrown (if overflow ## checking is turned on). proc min*(x, y: int): int {.magic: "MinI", noSideEffect.} @@ -500,18 +524,6 @@ proc abs*(x: float): float {.magic: "AbsF64", noSideEffect.} proc min*(x, y: float): float {.magic: "MinF64", noSideEffect.} proc max*(x, y: float): float {.magic: "MaxF64", noSideEffect.} -# boolean operators: -proc `and`*(x, y: bool): bool {.magic: "And", noSideEffect.} - ## Boolean ``and``; returns true iff ``x == y == true``. - ## Evaluation is short-circuited: This means that if ``x`` is false, - ## ``y`` will not even be evaluated. -proc `or`*(x, y: bool): bool {.magic: "Or", noSideEffect.} - ## Boolean ``or``; returns true iff ``not (not x and not y)``. - ## Evaluation is short-circuited: This means that if ``x`` is true, - ## ``y`` will not even be evaluated. -proc `xor`*(x, y: bool): bool {.magic: "Xor", noSideEffect.} - ## Boolean `exclusive or`; returns true iff ``x != y``. - # set operators proc `*` *[T](x, y: set[T]): set[T] {.magic: "MulSet", noSideEffect.} ## This operator computes the intersection of two sets. @@ -563,11 +575,12 @@ template `>` * (x, y: expr): expr = ## "is greater" operator. This is the same as ``y < x``. y < x -proc in_Operator*[T](x: set[T], y: T): bool {.magic: "InSet", noSideEffect.} +proc contains*[T](x: set[T], y: T): bool {.magic: "InSet", noSideEffect.} ## One should overload this proc if one wants to overload the ``in`` operator. - ## The parameters are in reverse order! This is because the unification - ## algorithm that Nimrod uses for overload resolution works from left to - ## right. + ## The parameters are in reverse order! ``a in b`` is a template for + ## ``contains(b, a)``. + ## This is because the unification algorithm that Nimrod uses for overload + ## resolution works from left to right. ## But for the ``in`` operator that would be the wrong direction for this ## piece of code: ## @@ -578,11 +591,11 @@ proc in_Operator*[T](x: set[T], y: T): bool {.magic: "InSet", noSideEffect.} ## If ``in`` had been declared as ``[T](elem: T, s: set[T])`` then ``T`` would ## have been bound to ``char``. But ``s`` is not compatible to type ## ``set[char]``! The solution is to bind ``T`` to ``range['a'..'z']``. This - ## is achieved by reversing the parameters for ``in_operator``; ``in`` then + ## is achieved by reversing the parameters for ``contains``; ``in`` then ## passes its arguments in reverse order. -template `in` * (x, y: expr): expr = in_Operator(y, x) -template `not_in` * (x, y: expr): expr = not in_Operator(y, x) +template `in` * (x, y: expr): expr = contains(y, x) +template `not_in` * (x, y: expr): expr = not contains(y, x) proc `is` *[T, S](x: T, y: S): bool {.magic: "Is", noSideEffect.} template `is_not` *(x, y: expr): expr = not (x is y) @@ -616,15 +629,17 @@ proc `&` * (x: char, y: string): string {. magic: "ConStrStr", noSideEffect, merge.} ## is the `concatenation operator`. It concatenates `x` and `y`. -proc add * (x: var string, y: char) {.magic: "AppendStrCh".} -proc add * (x: var string, y: string) {.magic: "AppendStrStr".} +proc add*(x: var string, y: char) {.magic: "AppendStrCh".} +proc add*(x: var string, y: string) {.magic: "AppendStrStr".} when not defined(ECMAScript): + {.push overflow_checks:off} proc add* (x: var string, y: cstring) = var i = 0 while y[i] != '\0': add(x, y[i]) inc(i) + {.pop.} else: proc add* (x: var string, y: cstring) {.pure.} = asm """ @@ -646,7 +661,7 @@ proc add *[T](x: var seq[T], y: seq[T]) {.magic: "AppendSeqSeq".} proc repr*[T](x: T): string {.magic: "Repr", noSideEffect.} ## takes any Nimrod variable and returns its string representation. It - ## works even for complex data graphs with cycles. This is an invaluable + ## works even for complex data graphs with cycles. This is a great ## debugging tool. type @@ -729,7 +744,16 @@ const cpuEndian* {.magic: "CpuEndian"}: TEndian = littleEndian ## is the endianness of the target CPU. This is a valuable piece of ## information for low-level code only. This works thanks to compiler magic. - + + hostOS* {.magic: "HostOS"}: string = "" + ## a string that describes the host operating system. Possible values: + ## "windows", "macosx", "linux", "netbsd", "freebsd", "openbsd", "solaris", + ## "aix" + + hostCPU* {.magic: "HostCPU"}: string = "" + ## a string that describes the host CPU. Possible values: + ## "i386", "alpha", "powerpc", "sparc", "amd64", "mips", "arm" + proc toFloat*(i: int): float {. magic: "ToFloat", noSideEffect, importc: "toFloat".} ## converts an integer `i` into a ``float``. If the conversion @@ -896,6 +920,12 @@ proc `$` *(x: string): string {.magic: "StrToStr", noSideEffect.} ## as it is. This operator is useful for generic code, so ## that ``$expr`` also works if ``expr`` is already a string. +proc `$` *(x: TAnyEnum): string {.magic: "EnumToStr", noSideEffect.} + ## The stingify operator for an enumeration argument. This works for + ## any enumeration type thanks to compiler magic. If a + ## a ``$`` operator for a concrete enumeration is provided, this is + ## used instead. (In other words: *Overwriting* is possible.) + # undocumented: proc getRefcount*[T](x: ref T): int {.importc: "getRefcount".} ## retrieves the reference count of an heap-allocated object. The @@ -1136,6 +1166,10 @@ proc echo*[Ty](x: Ty) {.inline.} ## equivalent to ``writeln(stdout, x); flush(stdout)``. BUT: This is ## available for the ECMAScript target too! +proc echo*[Ty](x: openarray[Ty]) {.inline.} + ## equivalent to ``writeln(stdout, x); flush(stdout)``. BUT: This is + ## available for the ECMAScript target too! + template newException(exceptn, message: expr): expr = block: # open a new scope @@ -1169,8 +1203,6 @@ when not defined(EcmaScript) and not defined(NimrodVM): when not defined(EcmaScript) and not defined(NimrodVM): - include hti - proc initGC() var @@ -1370,13 +1402,6 @@ when not defined(EcmaScript) and not defined(NimrodVM): include arithm {.pop.} # stack trace - # sequence type declarations here because the GC needs them too: - type - TGenericSeq {.compilerproc, pure.} = object - len, space: int - - PGenericSeq {.exportc.} = ptr TGenericSeq - const GenericSeqSize = (2 * sizeof(int)) @@ -1417,13 +1442,12 @@ elif defined(NimrodVM): proc getFreeMem(): int = return -1 proc getTotalMem(): int = return -1 proc echo[Ty](x: Ty) = nil + proc echo[Ty](x: openarray[Ty]) = nil proc cmp(x, y: string): int = if x == y: return 0 if x < y: return -1 return 1 -include macros - {.pop.} # checks {.pop.} # hints diff --git a/lib/times.nim b/lib/times.nim index 774c9930c..459b6c2ad 100644 --- a/lib/times.nim +++ b/lib/times.nim @@ -276,8 +276,8 @@ else: proc getDateStr(): string = var ti = getLocalTime(getTime()) - result = $ti.year & "-" & intToStr(ord(ti.month)+1, 2) & - "-" & intToStr(ti.monthDay, 2) + result = $ti.year & '-' & intToStr(ord(ti.month)+1, 2) & + '-' & intToStr(ti.monthDay, 2) proc getClockStr(): string = var ti = getLocalTime(getTime()) diff --git a/lib/unicode.nim b/lib/unicode.nim index e6665fbe2..045439690 100644 --- a/lib/unicode.nim +++ b/lib/unicode.nim @@ -7,28 +7,28 @@ # distribution, for details about the copyright. # -## This module provides a way to handle various Unicode (or other) encodings. +## This module provides support to handle the Unicode UTF-8 encoding. type - TUniChar* = int32 ## type that can hold any Unicode character - TUniChar16* = int16 ## 16 bit Unicode character + TRune* = int ## type that can hold any Unicode character + TRune16* = int16 ## 16 bit Unicode character -template ones(n) = ((1 shl n)-1) +template ones(n: expr): expr = ((1 shl n)-1) -proc uniCharLen*(s: string): int = +proc runeLen*(s: string): int = ## returns the number of Unicode characters of the string `s`. var i = 0 while i < len(s): - if ord(s[i]) <= 127: inc(i) + if ord(s[i]) <=% 127: inc(i) elif ord(s[i]) shr 5 == 0b110: inc(i, 2) elif ord(s[i]) shr 4 == 0b1110: inc(i, 3) elif ord(s[i]) shr 3 == 0b11110: inc(i, 4) else: assert(false) inc(result) -proc uniCharAt*(s: string, i: int): TUniChar = +proc runeAt*(s: string, i: int): TRune = ## returns the unicode character in `s` at byte index `i` - if ord(s[i]) <= 127: + if ord(s[i]) <=% 127: result = ord(s[i]) elif ord(s[i]) shr 5 == 0b110: assert(ord(s[i+1]) shr 6 == 0b10) @@ -50,104 +50,1119 @@ proc uniCharAt*(s: string, i: int): TUniChar = else: assert(false) -iterator unichars*(s: string): TUniChar = +template fastRuneAt(s, i, result: expr): stmt = + if ord(s[i]) <=% 127: + result = ord(s[i]) + inc(i) + elif ord(s[i]) shr 5 == 0b110: + assert(ord(s[i+1]) shr 6 == 0b10) + result = (ord(s[i]) and ones(5)) shl 6 or (ord(s[i+1]) and ones(6)) + inc(i, 2) + elif ord(s[i]) shr 4 == 0b1110: + assert(ord(s[i+1]) shr 6 == 0b10) + assert(ord(s[i+2]) shr 6 == 0b10) + result = (ord(s[i]) and ones(4)) shl 12 or + (ord(s[i+1]) and ones(6)) shl 6 or + (ord(s[i+2]) and ones(6)) + inc(i, 3) + elif ord(s[i]) shr 3 == 0b11110: + assert(ord(s[i+1]) shr 6 == 0b10) + assert(ord(s[i+2]) shr 6 == 0b10) + assert(ord(s[i+3]) shr 6 == 0b10) + result = (ord(s[i]) and ones(3)) shl 18 or + (ord(s[i+1]) and ones(6)) shl 12 or + (ord(s[i+2]) and ones(6)) shl 6 or + (ord(s[i+3]) and ones(6)) + inc(i, 4) + else: + assert(false) + +proc toUTF8*(c: TRune): string = + ## converts a character into its UTF8 representation + if c <=% 127: + result = newString(1) + result[0] = chr(c) + elif c <=% 0x07FF: + result = newString(2) + result[0] = chr(c shr 6 or 0b110_0000) + result[1] = chr(c and ones(6) or 0b10_000000) + elif c <=% 0xFFFF: + result = newString(3) + result[0] = chr(c shr 12 or 0b1110_0000) + result[1] = chr(c shr 6 and ones(6) or 0b10_0000_00) + result[2] = chr(c and ones(6) or 0b10_0000_00) + elif c <=% 0x0010FFFF: + result = newString(4) + result[0] = chr(c shr 18 or 0b1111_0000) + result[1] = chr(c shr 12 and ones(6) or 0b10_0000_00) + result[2] = chr(c shr 6 and ones(6) or 0b10_0000_00) + result[3] = chr(c and ones(6) or 0b10_0000_00) + else: + assert false + +const + alphaRanges = [ + 0x00d8, 0x00f6, # Ø - ö + 0x00f8, 0x01f5, # ø - ǵ + 0x0250, 0x02a8, # ɐ - ʨ + 0x038e, 0x03a1, # Ύ - Ρ + 0x03a3, 0x03ce, # Σ - ώ + 0x03d0, 0x03d6, # ϐ - ϖ + 0x03e2, 0x03f3, # Ϣ - ϳ + 0x0490, 0x04c4, # Ґ - ӄ + 0x0561, 0x0587, # ա - և + 0x05d0, 0x05ea, # א - ת + 0x05f0, 0x05f2, # װ - ײ + 0x0621, 0x063a, # ء - غ + 0x0640, 0x064a, # ـ - ي + 0x0671, 0x06b7, # ٱ - ڷ + 0x06ba, 0x06be, # ں - ھ + 0x06c0, 0x06ce, # ۀ - ێ + 0x06d0, 0x06d3, # ې - ۓ + 0x0905, 0x0939, # अ - ह + 0x0958, 0x0961, # क़ - ॡ + 0x0985, 0x098c, # অ - ঌ + 0x098f, 0x0990, # এ - ঐ + 0x0993, 0x09a8, # ও - ন + 0x09aa, 0x09b0, # প - র + 0x09b6, 0x09b9, # শ - হ + 0x09dc, 0x09dd, # ড় - ঢ় + 0x09df, 0x09e1, # য় - ৡ + 0x09f0, 0x09f1, # ৰ - ৱ + 0x0a05, 0x0a0a, # ਅ - ਊ + 0x0a0f, 0x0a10, # ਏ - ਐ + 0x0a13, 0x0a28, # ਓ - ਨ + 0x0a2a, 0x0a30, # ਪ - ਰ + 0x0a32, 0x0a33, # ਲ - ਲ਼ + 0x0a35, 0x0a36, # ਵ - ਸ਼ + 0x0a38, 0x0a39, # ਸ - ਹ + 0x0a59, 0x0a5c, # ਖ਼ - ੜ + 0x0a85, 0x0a8b, # અ - ઋ + 0x0a8f, 0x0a91, # એ - ઑ + 0x0a93, 0x0aa8, # ઓ - ન + 0x0aaa, 0x0ab0, # પ - ર + 0x0ab2, 0x0ab3, # લ - ળ + 0x0ab5, 0x0ab9, # વ - હ + 0x0b05, 0x0b0c, # ଅ - ଌ + 0x0b0f, 0x0b10, # ଏ - ଐ + 0x0b13, 0x0b28, # ଓ - ନ + 0x0b2a, 0x0b30, # ପ - ର + 0x0b32, 0x0b33, # ଲ - ଳ + 0x0b36, 0x0b39, # ଶ - ହ + 0x0b5c, 0x0b5d, # ଡ଼ - ଢ଼ + 0x0b5f, 0x0b61, # ୟ - ୡ + 0x0b85, 0x0b8a, # அ - ஊ + 0x0b8e, 0x0b90, # எ - ஐ + 0x0b92, 0x0b95, # ஒ - க + 0x0b99, 0x0b9a, # ங - ச + 0x0b9e, 0x0b9f, # ஞ - ட + 0x0ba3, 0x0ba4, # ண - த + 0x0ba8, 0x0baa, # ந - ப + 0x0bae, 0x0bb5, # ம - வ + 0x0bb7, 0x0bb9, # ஷ - ஹ + 0x0c05, 0x0c0c, # అ - ఌ + 0x0c0e, 0x0c10, # ఎ - ఐ + 0x0c12, 0x0c28, # ఒ - న + 0x0c2a, 0x0c33, # ప - ళ + 0x0c35, 0x0c39, # వ - హ + 0x0c60, 0x0c61, # ౠ - ౡ + 0x0c85, 0x0c8c, # ಅ - ಌ + 0x0c8e, 0x0c90, # ಎ - ಐ + 0x0c92, 0x0ca8, # ಒ - ನ + 0x0caa, 0x0cb3, # ಪ - ಳ + 0x0cb5, 0x0cb9, # ವ - ಹ + 0x0ce0, 0x0ce1, # ೠ - ೡ + 0x0d05, 0x0d0c, # അ - ഌ + 0x0d0e, 0x0d10, # എ - ഐ + 0x0d12, 0x0d28, # ഒ - ന + 0x0d2a, 0x0d39, # പ - ഹ + 0x0d60, 0x0d61, # ൠ - ൡ + 0x0e01, 0x0e30, # ก - ะ + 0x0e32, 0x0e33, # า - ำ + 0x0e40, 0x0e46, # เ - ๆ + 0x0e5a, 0x0e5b, # ๚ - ๛ + 0x0e81, 0x0e82, # ກ - ຂ + 0x0e87, 0x0e88, # ງ - ຈ + 0x0e94, 0x0e97, # ດ - ທ + 0x0e99, 0x0e9f, # ນ - ຟ + 0x0ea1, 0x0ea3, # ມ - ຣ + 0x0eaa, 0x0eab, # ສ - ຫ + 0x0ead, 0x0eae, # ອ - ຮ + 0x0eb2, 0x0eb3, # າ - ຳ + 0x0ec0, 0x0ec4, # ເ - ໄ + 0x0edc, 0x0edd, # ໜ - ໝ + 0x0f18, 0x0f19, # ༘ - ༙ + 0x0f40, 0x0f47, # ཀ - ཇ + 0x0f49, 0x0f69, # ཉ - ཀྵ + 0x10d0, 0x10f6, # ა - ჶ + 0x1100, 0x1159, # ᄀ - ᅙ + 0x115f, 0x11a2, # ᅟ - ᆢ + 0x11a8, 0x11f9, # ᆨ - ᇹ + 0x1e00, 0x1e9b, # Ḁ - ẛ + 0x1f50, 0x1f57, # ὐ - ὗ + 0x1f80, 0x1fb4, # ᾀ - ᾴ + 0x1fb6, 0x1fbc, # ᾶ - ᾼ + 0x1fc2, 0x1fc4, # ῂ - ῄ + 0x1fc6, 0x1fcc, # ῆ - ῌ + 0x1fd0, 0x1fd3, # ῐ - ΐ + 0x1fd6, 0x1fdb, # ῖ - Ί + 0x1fe0, 0x1fec, # ῠ - Ῥ + 0x1ff2, 0x1ff4, # ῲ - ῴ + 0x1ff6, 0x1ffc, # ῶ - ῼ + 0x210a, 0x2113, # ℊ - ℓ + 0x2115, 0x211d, # ℕ - ℝ + 0x2120, 0x2122, # ℠ - ™ + 0x212a, 0x2131, # K - ℱ + 0x2133, 0x2138, # ℳ - ℸ + 0x3041, 0x3094, # ぁ - ゔ + 0x30a1, 0x30fa, # ァ - ヺ + 0x3105, 0x312c, # ㄅ - ㄬ + 0x3131, 0x318e, # ㄱ - ㆎ + 0x3192, 0x319f, # ㆒ - ㆟ + 0x3260, 0x327b, # ㉠ - ㉻ + 0x328a, 0x32b0, # ㊊ - ㊰ + 0x32d0, 0x32fe, # ㋐ - ㋾ + 0x3300, 0x3357, # ㌀ - ㍗ + 0x3371, 0x3376, # ㍱ - ㍶ + 0x337b, 0x3394, # ㍻ - ㎔ + 0x3399, 0x339e, # ㎙ - ㎞ + 0x33a9, 0x33ad, # ㎩ - ㎭ + 0x33b0, 0x33c1, # ㎰ - ㏁ + 0x33c3, 0x33c5, # ㏃ - ㏅ + 0x33c7, 0x33d7, # ㏇ - ㏗ + 0x33d9, 0x33dd, # ㏙ - ㏝ + 0x4e00, 0x9fff, # 一 - 鿿 + 0xac00, 0xd7a3, # 가 - 힣 + 0xf900, 0xfb06, # 豈 - st + 0xfb13, 0xfb17, # ﬓ - ﬗ + 0xfb1f, 0xfb28, # ײַ - ﬨ + 0xfb2a, 0xfb36, # שׁ - זּ + 0xfb38, 0xfb3c, # טּ - לּ + 0xfb40, 0xfb41, # נּ - סּ + 0xfb43, 0xfb44, # ףּ - פּ + 0xfb46, 0xfbb1, # צּ - ﮱ + 0xfbd3, 0xfd3d, # ﯓ - ﴽ + 0xfd50, 0xfd8f, # ﵐ - ﶏ + 0xfd92, 0xfdc7, # ﶒ - ﷇ + 0xfdf0, 0xfdf9, # ﷰ - ﷹ + 0xfe70, 0xfe72, # ﹰ - ﹲ + 0xfe76, 0xfefc, # ﹶ - ﻼ + 0xff66, 0xff6f, # ヲ - ッ + 0xff71, 0xff9d, # ア - ン + 0xffa0, 0xffbe, # ᅠ - ᄒ + 0xffc2, 0xffc7, # ᅡ - ᅦ + 0xffca, 0xffcf, # ᅧ - ᅬ + 0xffd2, 0xffd7, # ᅭ - ᅲ + 0xffda, 0xffdc] # ᅳ - ᅵ + + alphaSinglets = [ + 0x00aa, # ª + 0x00b5, # µ + 0x00ba, # º + 0x03da, # Ϛ + 0x03dc, # Ϝ + 0x03de, # Ϟ + 0x03e0, # Ϡ + 0x06d5, # ە + 0x09b2, # ল + 0x0a5e, # ਫ਼ + 0x0a8d, # ઍ + 0x0ae0, # ૠ + 0x0b9c, # ஜ + 0x0cde, # ೞ + 0x0e4f, # ๏ + 0x0e84, # ຄ + 0x0e8a, # ຊ + 0x0e8d, # ຍ + 0x0ea5, # ລ + 0x0ea7, # ວ + 0x0eb0, # ະ + 0x0ebd, # ຽ + 0x1fbe, # ι + 0x207f, # ⁿ + 0x20a8, # ₨ + 0x2102, # ℂ + 0x2107, # ℇ + 0x2124, # ℤ + 0x2126, # Ω + 0x2128, # ℨ + 0xfb3e, # מּ + 0xfe74] # ﹴ + + spaceRanges = [ + 0x0009, 0x000a, # tab and newline + 0x0020, 0x0020, # space + 0x00a0, 0x00a0, #   + 0x2000, 0x200b, #   - ​ + 0x2028, 0x2029, # - 
 0x3000, 0x3000, #   + 0xfeff, 0xfeff] #  + + toupperRanges = [ + 0x0061, 0x007a, 468, # a-z A-Z + 0x00e0, 0x00f6, 468, # à-ö À-Ö + 0x00f8, 0x00fe, 468, # ø-þ Ø-Þ + 0x0256, 0x0257, 295, # ɖ-ɗ Ɖ-Ɗ + 0x0258, 0x0259, 298, # ɘ-ə Ǝ-Ə + 0x028a, 0x028b, 283, # ʊ-ʋ Ʊ-Ʋ + 0x03ad, 0x03af, 463, # έ-ί Έ-Ί + 0x03b1, 0x03c1, 468, # α-ρ Α-Ρ + 0x03c3, 0x03cb, 468, # σ-ϋ Σ-Ϋ + 0x03cd, 0x03ce, 437, # ύ-ώ Ύ-Ώ + 0x0430, 0x044f, 468, # а-я А-Я + 0x0451, 0x045c, 420, # ё-ќ Ё-Ќ + 0x045e, 0x045f, 420, # ў-џ Ў-Џ + 0x0561, 0x0586, 452, # ա-ֆ Ա-Ֆ + 0x1f00, 0x1f07, 508, # ἀ-ἇ Ἀ-Ἇ + 0x1f10, 0x1f15, 508, # ἐ-ἕ Ἐ-Ἕ + 0x1f20, 0x1f27, 508, # ἠ-ἧ Ἠ-Ἧ + 0x1f30, 0x1f37, 508, # ἰ-ἷ Ἰ-Ἷ + 0x1f40, 0x1f45, 508, # ὀ-ὅ Ὀ-Ὅ + 0x1f60, 0x1f67, 508, # ὠ-ὧ Ὠ-Ὧ + 0x1f70, 0x1f71, 574, # ὰ-ά Ὰ-Ά + 0x1f72, 0x1f75, 586, # ὲ-ή Ὲ-Ή + 0x1f76, 0x1f77, 600, # ὶ-ί Ὶ-Ί + 0x1f78, 0x1f79, 628, # ὸ-ό Ὸ-Ό + 0x1f7a, 0x1f7b, 612, # ὺ-ύ Ὺ-Ύ + 0x1f7c, 0x1f7d, 626, # ὼ-ώ Ὼ-Ώ + 0x1f80, 0x1f87, 508, # ᾀ-ᾇ ᾈ-ᾏ + 0x1f90, 0x1f97, 508, # ᾐ-ᾗ ᾘ-ᾟ + 0x1fa0, 0x1fa7, 508, # ᾠ-ᾧ ᾨ-ᾯ + 0x1fb0, 0x1fb1, 508, # ᾰ-ᾱ Ᾰ-Ᾱ + 0x1fd0, 0x1fd1, 508, # ῐ-ῑ Ῐ-Ῑ + 0x1fe0, 0x1fe1, 508, # ῠ-ῡ Ῠ-Ῡ + 0x2170, 0x217f, 484, # ⅰ-ⅿ Ⅰ-Ⅿ + 0x24d0, 0x24e9, 474, # ⓐ-ⓩ Ⓐ-Ⓩ + 0xff41, 0xff5a, 468] # a-z A-Z + + toupperSinglets = [ + 0x00ff, 621, # ÿ Ÿ + 0x0101, 499, # ā Ā + 0x0103, 499, # ă Ă + 0x0105, 499, # ą Ą + 0x0107, 499, # ć Ć + 0x0109, 499, # ĉ Ĉ + 0x010b, 499, # ċ Ċ + 0x010d, 499, # č Č + 0x010f, 499, # ď Ď + 0x0111, 499, # đ Đ + 0x0113, 499, # ē Ē + 0x0115, 499, # ĕ Ĕ + 0x0117, 499, # ė Ė + 0x0119, 499, # ę Ę + 0x011b, 499, # ě Ě + 0x011d, 499, # ĝ Ĝ + 0x011f, 499, # ğ Ğ + 0x0121, 499, # ġ Ġ + 0x0123, 499, # ģ Ģ + 0x0125, 499, # ĥ Ĥ + 0x0127, 499, # ħ Ħ + 0x0129, 499, # ĩ Ĩ + 0x012b, 499, # ī Ī + 0x012d, 499, # ĭ Ĭ + 0x012f, 499, # į Į + 0x0131, 268, # ı I + 0x0133, 499, # ij IJ + 0x0135, 499, # ĵ Ĵ + 0x0137, 499, # ķ Ķ + 0x013a, 499, # ĺ Ĺ + 0x013c, 499, # ļ Ļ + 0x013e, 499, # ľ Ľ + 0x0140, 499, # ŀ Ŀ + 0x0142, 499, # ł Ł + 0x0144, 499, # ń Ń + 0x0146, 499, # ņ Ņ + 0x0148, 499, # ň Ň + 0x014b, 499, # ŋ Ŋ + 0x014d, 499, # ō Ō + 0x014f, 499, # ŏ Ŏ + 0x0151, 499, # ő Ő + 0x0153, 499, # œ Œ + 0x0155, 499, # ŕ Ŕ + 0x0157, 499, # ŗ Ŗ + 0x0159, 499, # ř Ř + 0x015b, 499, # ś Ś + 0x015d, 499, # ŝ Ŝ + 0x015f, 499, # ş Ş + 0x0161, 499, # š Š + 0x0163, 499, # ţ Ţ + 0x0165, 499, # ť Ť + 0x0167, 499, # ŧ Ŧ + 0x0169, 499, # ũ Ũ + 0x016b, 499, # ū Ū + 0x016d, 499, # ŭ Ŭ + 0x016f, 499, # ů Ů + 0x0171, 499, # ű Ű + 0x0173, 499, # ų Ų + 0x0175, 499, # ŵ Ŵ + 0x0177, 499, # ŷ Ŷ + 0x017a, 499, # ź Ź + 0x017c, 499, # ż Ż + 0x017e, 499, # ž Ž + 0x017f, 200, # ſ S + 0x0183, 499, # ƃ Ƃ + 0x0185, 499, # ƅ Ƅ + 0x0188, 499, # ƈ Ƈ + 0x018c, 499, # ƌ Ƌ + 0x0192, 499, # ƒ Ƒ + 0x0199, 499, # ƙ Ƙ + 0x01a1, 499, # ơ Ơ + 0x01a3, 499, # ƣ Ƣ + 0x01a5, 499, # ƥ Ƥ + 0x01a8, 499, # ƨ Ƨ + 0x01ad, 499, # ƭ Ƭ + 0x01b0, 499, # ư Ư + 0x01b4, 499, # ƴ Ƴ + 0x01b6, 499, # ƶ Ƶ + 0x01b9, 499, # ƹ Ƹ + 0x01bd, 499, # ƽ Ƽ + 0x01c5, 499, # Dž DŽ + 0x01c6, 498, # dž DŽ + 0x01c8, 499, # Lj LJ + 0x01c9, 498, # lj LJ + 0x01cb, 499, # Nj NJ + 0x01cc, 498, # nj NJ + 0x01ce, 499, # ǎ Ǎ + 0x01d0, 499, # ǐ Ǐ + 0x01d2, 499, # ǒ Ǒ + 0x01d4, 499, # ǔ Ǔ + 0x01d6, 499, # ǖ Ǖ + 0x01d8, 499, # ǘ Ǘ + 0x01da, 499, # ǚ Ǚ + 0x01dc, 499, # ǜ Ǜ + 0x01df, 499, # ǟ Ǟ + 0x01e1, 499, # ǡ Ǡ + 0x01e3, 499, # ǣ Ǣ + 0x01e5, 499, # ǥ Ǥ + 0x01e7, 499, # ǧ Ǧ + 0x01e9, 499, # ǩ Ǩ + 0x01eb, 499, # ǫ Ǫ + 0x01ed, 499, # ǭ Ǭ + 0x01ef, 499, # ǯ Ǯ + 0x01f2, 499, # Dz DZ + 0x01f3, 498, # dz DZ + 0x01f5, 499, # ǵ Ǵ + 0x01fb, 499, # ǻ Ǻ + 0x01fd, 499, # ǽ Ǽ + 0x01ff, 499, # ǿ Ǿ + 0x0201, 499, # ȁ Ȁ + 0x0203, 499, # ȃ Ȃ + 0x0205, 499, # ȅ Ȅ + 0x0207, 499, # ȇ Ȇ + 0x0209, 499, # ȉ Ȉ + 0x020b, 499, # ȋ Ȋ + 0x020d, 499, # ȍ Ȍ + 0x020f, 499, # ȏ Ȏ + 0x0211, 499, # ȑ Ȑ + 0x0213, 499, # ȓ Ȓ + 0x0215, 499, # ȕ Ȕ + 0x0217, 499, # ȗ Ȗ + 0x0253, 290, # ɓ Ɓ + 0x0254, 294, # ɔ Ɔ + 0x025b, 297, # ɛ Ɛ + 0x0260, 295, # ɠ Ɠ + 0x0263, 293, # ɣ Ɣ + 0x0268, 291, # ɨ Ɨ + 0x0269, 289, # ɩ Ɩ + 0x026f, 289, # ɯ Ɯ + 0x0272, 287, # ɲ Ɲ + 0x0283, 282, # ʃ Ʃ + 0x0288, 282, # ʈ Ʈ + 0x0292, 281, # ʒ Ʒ + 0x03ac, 462, # ά Ά + 0x03cc, 436, # ό Ό + 0x03d0, 438, # ϐ Β + 0x03d1, 443, # ϑ Θ + 0x03d5, 453, # ϕ Φ + 0x03d6, 446, # ϖ Π + 0x03e3, 499, # ϣ Ϣ + 0x03e5, 499, # ϥ Ϥ + 0x03e7, 499, # ϧ Ϧ + 0x03e9, 499, # ϩ Ϩ + 0x03eb, 499, # ϫ Ϫ + 0x03ed, 499, # ϭ Ϭ + 0x03ef, 499, # ϯ Ϯ + 0x03f0, 414, # ϰ Κ + 0x03f1, 420, # ϱ Ρ + 0x0461, 499, # ѡ Ѡ + 0x0463, 499, # ѣ Ѣ + 0x0465, 499, # ѥ Ѥ + 0x0467, 499, # ѧ Ѧ + 0x0469, 499, # ѩ Ѩ + 0x046b, 499, # ѫ Ѫ + 0x046d, 499, # ѭ Ѭ + 0x046f, 499, # ѯ Ѯ + 0x0471, 499, # ѱ Ѱ + 0x0473, 499, # ѳ Ѳ + 0x0475, 499, # ѵ Ѵ + 0x0477, 499, # ѷ Ѷ + 0x0479, 499, # ѹ Ѹ + 0x047b, 499, # ѻ Ѻ + 0x047d, 499, # ѽ Ѽ + 0x047f, 499, # ѿ Ѿ + 0x0481, 499, # ҁ Ҁ + 0x0491, 499, # ґ Ґ + 0x0493, 499, # ғ Ғ + 0x0495, 499, # ҕ Ҕ + 0x0497, 499, # җ Җ + 0x0499, 499, # ҙ Ҙ + 0x049b, 499, # қ Қ + 0x049d, 499, # ҝ Ҝ + 0x049f, 499, # ҟ Ҟ + 0x04a1, 499, # ҡ Ҡ + 0x04a3, 499, # ң Ң + 0x04a5, 499, # ҥ Ҥ + 0x04a7, 499, # ҧ Ҧ + 0x04a9, 499, # ҩ Ҩ + 0x04ab, 499, # ҫ Ҫ + 0x04ad, 499, # ҭ Ҭ + 0x04af, 499, # ү Ү + 0x04b1, 499, # ұ Ұ + 0x04b3, 499, # ҳ Ҳ + 0x04b5, 499, # ҵ Ҵ + 0x04b7, 499, # ҷ Ҷ + 0x04b9, 499, # ҹ Ҹ + 0x04bb, 499, # һ Һ + 0x04bd, 499, # ҽ Ҽ + 0x04bf, 499, # ҿ Ҿ + 0x04c2, 499, # ӂ Ӂ + 0x04c4, 499, # ӄ Ӄ + 0x04c8, 499, # ӈ Ӈ + 0x04cc, 499, # ӌ Ӌ + 0x04d1, 499, # ӑ Ӑ + 0x04d3, 499, # ӓ Ӓ + 0x04d5, 499, # ӕ Ӕ + 0x04d7, 499, # ӗ Ӗ + 0x04d9, 499, # ә Ә + 0x04db, 499, # ӛ Ӛ + 0x04dd, 499, # ӝ Ӝ + 0x04df, 499, # ӟ Ӟ + 0x04e1, 499, # ӡ Ӡ + 0x04e3, 499, # ӣ Ӣ + 0x04e5, 499, # ӥ Ӥ + 0x04e7, 499, # ӧ Ӧ + 0x04e9, 499, # ө Ө + 0x04eb, 499, # ӫ Ӫ + 0x04ef, 499, # ӯ Ӯ + 0x04f1, 499, # ӱ Ӱ + 0x04f3, 499, # ӳ Ӳ + 0x04f5, 499, # ӵ Ӵ + 0x04f9, 499, # ӹ Ӹ + 0x1e01, 499, # ḁ Ḁ + 0x1e03, 499, # ḃ Ḃ + 0x1e05, 499, # ḅ Ḅ + 0x1e07, 499, # ḇ Ḇ + 0x1e09, 499, # ḉ Ḉ + 0x1e0b, 499, # ḋ Ḋ + 0x1e0d, 499, # ḍ Ḍ + 0x1e0f, 499, # ḏ Ḏ + 0x1e11, 499, # ḑ Ḑ + 0x1e13, 499, # ḓ Ḓ + 0x1e15, 499, # ḕ Ḕ + 0x1e17, 499, # ḗ Ḗ + 0x1e19, 499, # ḙ Ḙ + 0x1e1b, 499, # ḛ Ḛ + 0x1e1d, 499, # ḝ Ḝ + 0x1e1f, 499, # ḟ Ḟ + 0x1e21, 499, # ḡ Ḡ + 0x1e23, 499, # ḣ Ḣ + 0x1e25, 499, # ḥ Ḥ + 0x1e27, 499, # ḧ Ḧ + 0x1e29, 499, # ḩ Ḩ + 0x1e2b, 499, # ḫ Ḫ + 0x1e2d, 499, # ḭ Ḭ + 0x1e2f, 499, # ḯ Ḯ + 0x1e31, 499, # ḱ Ḱ + 0x1e33, 499, # ḳ Ḳ + 0x1e35, 499, # ḵ Ḵ + 0x1e37, 499, # ḷ Ḷ + 0x1e39, 499, # ḹ Ḹ + 0x1e3b, 499, # ḻ Ḻ + 0x1e3d, 499, # ḽ Ḽ + 0x1e3f, 499, # ḿ Ḿ + 0x1e41, 499, # ṁ Ṁ + 0x1e43, 499, # ṃ Ṃ + 0x1e45, 499, # ṅ Ṅ + 0x1e47, 499, # ṇ Ṇ + 0x1e49, 499, # ṉ Ṉ + 0x1e4b, 499, # ṋ Ṋ + 0x1e4d, 499, # ṍ Ṍ + 0x1e4f, 499, # ṏ Ṏ + 0x1e51, 499, # ṑ Ṑ + 0x1e53, 499, # ṓ Ṓ + 0x1e55, 499, # ṕ Ṕ + 0x1e57, 499, # ṗ Ṗ + 0x1e59, 499, # ṙ Ṙ + 0x1e5b, 499, # ṛ Ṛ + 0x1e5d, 499, # ṝ Ṝ + 0x1e5f, 499, # ṟ Ṟ + 0x1e61, 499, # ṡ Ṡ + 0x1e63, 499, # ṣ Ṣ + 0x1e65, 499, # ṥ Ṥ + 0x1e67, 499, # ṧ Ṧ + 0x1e69, 499, # ṩ Ṩ + 0x1e6b, 499, # ṫ Ṫ + 0x1e6d, 499, # ṭ Ṭ + 0x1e6f, 499, # ṯ Ṯ + 0x1e71, 499, # ṱ Ṱ + 0x1e73, 499, # ṳ Ṳ + 0x1e75, 499, # ṵ Ṵ + 0x1e77, 499, # ṷ Ṷ + 0x1e79, 499, # ṹ Ṹ + 0x1e7b, 499, # ṻ Ṻ + 0x1e7d, 499, # ṽ Ṽ + 0x1e7f, 499, # ṿ Ṿ + 0x1e81, 499, # ẁ Ẁ + 0x1e83, 499, # ẃ Ẃ + 0x1e85, 499, # ẅ Ẅ + 0x1e87, 499, # ẇ Ẇ + 0x1e89, 499, # ẉ Ẉ + 0x1e8b, 499, # ẋ Ẋ + 0x1e8d, 499, # ẍ Ẍ + 0x1e8f, 499, # ẏ Ẏ + 0x1e91, 499, # ẑ Ẑ + 0x1e93, 499, # ẓ Ẓ + 0x1e95, 499, # ẕ Ẕ + 0x1ea1, 499, # ạ Ạ + 0x1ea3, 499, # ả Ả + 0x1ea5, 499, # ấ Ấ + 0x1ea7, 499, # ầ Ầ + 0x1ea9, 499, # ẩ Ẩ + 0x1eab, 499, # ẫ Ẫ + 0x1ead, 499, # ậ Ậ + 0x1eaf, 499, # ắ Ắ + 0x1eb1, 499, # ằ Ằ + 0x1eb3, 499, # ẳ Ẳ + 0x1eb5, 499, # ẵ Ẵ + 0x1eb7, 499, # ặ Ặ + 0x1eb9, 499, # ẹ Ẹ + 0x1ebb, 499, # ẻ Ẻ + 0x1ebd, 499, # ẽ Ẽ + 0x1ebf, 499, # ế Ế + 0x1ec1, 499, # ề Ề + 0x1ec3, 499, # ể Ể + 0x1ec5, 499, # ễ Ễ + 0x1ec7, 499, # ệ Ệ + 0x1ec9, 499, # ỉ Ỉ + 0x1ecb, 499, # ị Ị + 0x1ecd, 499, # ọ Ọ + 0x1ecf, 499, # ỏ Ỏ + 0x1ed1, 499, # ố Ố + 0x1ed3, 499, # ồ Ồ + 0x1ed5, 499, # ổ Ổ + 0x1ed7, 499, # ỗ Ỗ + 0x1ed9, 499, # ộ Ộ + 0x1edb, 499, # ớ Ớ + 0x1edd, 499, # ờ Ờ + 0x1edf, 499, # ở Ở + 0x1ee1, 499, # ỡ Ỡ + 0x1ee3, 499, # ợ Ợ + 0x1ee5, 499, # ụ Ụ + 0x1ee7, 499, # ủ Ủ + 0x1ee9, 499, # ứ Ứ + 0x1eeb, 499, # ừ Ừ + 0x1eed, 499, # ử Ử + 0x1eef, 499, # ữ Ữ + 0x1ef1, 499, # ự Ự + 0x1ef3, 499, # ỳ Ỳ + 0x1ef5, 499, # ỵ Ỵ + 0x1ef7, 499, # ỷ Ỷ + 0x1ef9, 499, # ỹ Ỹ + 0x1f51, 508, # ὑ Ὑ + 0x1f53, 508, # ὓ Ὓ + 0x1f55, 508, # ὕ Ὕ + 0x1f57, 508, # ὗ Ὗ + 0x1fb3, 509, # ᾳ ᾼ + 0x1fc3, 509, # ῃ ῌ + 0x1fe5, 507, # ῥ Ῥ + 0x1ff3, 509] # ῳ ῼ + + tolowerRanges = [ + 0x0041, 0x005a, 532, # A-Z a-z + 0x00c0, 0x00d6, 532, # À-Ö à-ö + 0x00d8, 0x00de, 532, # Ø-Þ ø-þ + 0x0189, 0x018a, 705, # Ɖ-Ɗ ɖ-ɗ + 0x018e, 0x018f, 702, # Ǝ-Ə ɘ-ə + 0x01b1, 0x01b2, 717, # Ʊ-Ʋ ʊ-ʋ + 0x0388, 0x038a, 537, # Έ-Ί έ-ί + 0x038e, 0x038f, 563, # Ύ-Ώ ύ-ώ + 0x0391, 0x03a1, 532, # Α-Ρ α-ρ + 0x03a3, 0x03ab, 532, # Σ-Ϋ σ-ϋ + 0x0401, 0x040c, 580, # Ё-Ќ ё-ќ + 0x040e, 0x040f, 580, # Ў-Џ ў-џ + 0x0410, 0x042f, 532, # А-Я а-я + 0x0531, 0x0556, 548, # Ա-Ֆ ա-ֆ + 0x10a0, 0x10c5, 548, # Ⴀ-Ⴥ ა-ჵ + 0x1f08, 0x1f0f, 492, # Ἀ-Ἇ ἀ-ἇ + 0x1f18, 0x1f1d, 492, # Ἐ-Ἕ ἐ-ἕ + 0x1f28, 0x1f2f, 492, # Ἠ-Ἧ ἠ-ἧ + 0x1f38, 0x1f3f, 492, # Ἰ-Ἷ ἰ-ἷ + 0x1f48, 0x1f4d, 492, # Ὀ-Ὅ ὀ-ὅ + 0x1f68, 0x1f6f, 492, # Ὠ-Ὧ ὠ-ὧ + 0x1f88, 0x1f8f, 492, # ᾈ-ᾏ ᾀ-ᾇ + 0x1f98, 0x1f9f, 492, # ᾘ-ᾟ ᾐ-ᾗ + 0x1fa8, 0x1faf, 492, # ᾨ-ᾯ ᾠ-ᾧ + 0x1fb8, 0x1fb9, 492, # Ᾰ-Ᾱ ᾰ-ᾱ + 0x1fba, 0x1fbb, 426, # Ὰ-Ά ὰ-ά + 0x1fc8, 0x1fcb, 414, # Ὲ-Ή ὲ-ή + 0x1fd8, 0x1fd9, 492, # Ῐ-Ῑ ῐ-ῑ + 0x1fda, 0x1fdb, 400, # Ὶ-Ί ὶ-ί + 0x1fe8, 0x1fe9, 492, # Ῠ-Ῡ ῠ-ῡ + 0x1fea, 0x1feb, 388, # Ὺ-Ύ ὺ-ύ + 0x1ff8, 0x1ff9, 372, # Ὸ-Ό ὸ-ό + 0x1ffa, 0x1ffb, 374, # Ὼ-Ώ ὼ-ώ + 0x2160, 0x216f, 516, # Ⅰ-Ⅿ ⅰ-ⅿ + 0x24b6, 0x24cf, 526, # Ⓐ-Ⓩ ⓐ-ⓩ + 0xff21, 0xff3a, 532] # A-Z a-z + + tolowerSinglets = [ + 0x0100, 501, # Ā ā + 0x0102, 501, # Ă ă + 0x0104, 501, # Ą ą + 0x0106, 501, # Ć ć + 0x0108, 501, # Ĉ ĉ + 0x010a, 501, # Ċ ċ + 0x010c, 501, # Č č + 0x010e, 501, # Ď ď + 0x0110, 501, # Đ đ + 0x0112, 501, # Ē ē + 0x0114, 501, # Ĕ ĕ + 0x0116, 501, # Ė ė + 0x0118, 501, # Ę ę + 0x011a, 501, # Ě ě + 0x011c, 501, # Ĝ ĝ + 0x011e, 501, # Ğ ğ + 0x0120, 501, # Ġ ġ + 0x0122, 501, # Ģ ģ + 0x0124, 501, # Ĥ ĥ + 0x0126, 501, # Ħ ħ + 0x0128, 501, # Ĩ ĩ + 0x012a, 501, # Ī ī + 0x012c, 501, # Ĭ ĭ + 0x012e, 501, # Į į + 0x0130, 301, # İ i + 0x0132, 501, # IJ ij + 0x0134, 501, # Ĵ ĵ + 0x0136, 501, # Ķ ķ + 0x0139, 501, # Ĺ ĺ + 0x013b, 501, # Ļ ļ + 0x013d, 501, # Ľ ľ + 0x013f, 501, # Ŀ ŀ + 0x0141, 501, # Ł ł + 0x0143, 501, # Ń ń + 0x0145, 501, # Ņ ņ + 0x0147, 501, # Ň ň + 0x014a, 501, # Ŋ ŋ + 0x014c, 501, # Ō ō + 0x014e, 501, # Ŏ ŏ + 0x0150, 501, # Ő ő + 0x0152, 501, # Œ œ + 0x0154, 501, # Ŕ ŕ + 0x0156, 501, # Ŗ ŗ + 0x0158, 501, # Ř ř + 0x015a, 501, # Ś ś + 0x015c, 501, # Ŝ ŝ + 0x015e, 501, # Ş ş + 0x0160, 501, # Š š + 0x0162, 501, # Ţ ţ + 0x0164, 501, # Ť ť + 0x0166, 501, # Ŧ ŧ + 0x0168, 501, # Ũ ũ + 0x016a, 501, # Ū ū + 0x016c, 501, # Ŭ ŭ + 0x016e, 501, # Ů ů + 0x0170, 501, # Ű ű + 0x0172, 501, # Ų ų + 0x0174, 501, # Ŵ ŵ + 0x0176, 501, # Ŷ ŷ + 0x0178, 379, # Ÿ ÿ + 0x0179, 501, # Ź ź + 0x017b, 501, # Ż ż + 0x017d, 501, # Ž ž + 0x0181, 710, # Ɓ ɓ + 0x0182, 501, # Ƃ ƃ + 0x0184, 501, # Ƅ ƅ + 0x0186, 706, # Ɔ ɔ + 0x0187, 501, # Ƈ ƈ + 0x018b, 501, # Ƌ ƌ + 0x0190, 703, # Ɛ ɛ + 0x0191, 501, # Ƒ ƒ + 0x0193, 705, # Ɠ ɠ + 0x0194, 707, # Ɣ ɣ + 0x0196, 711, # Ɩ ɩ + 0x0197, 709, # Ɨ ɨ + 0x0198, 501, # Ƙ ƙ + 0x019c, 711, # Ɯ ɯ + 0x019d, 713, # Ɲ ɲ + 0x01a0, 501, # Ơ ơ + 0x01a2, 501, # Ƣ ƣ + 0x01a4, 501, # Ƥ ƥ + 0x01a7, 501, # Ƨ ƨ + 0x01a9, 718, # Ʃ ʃ + 0x01ac, 501, # Ƭ ƭ + 0x01ae, 718, # Ʈ ʈ + 0x01af, 501, # Ư ư + 0x01b3, 501, # Ƴ ƴ + 0x01b5, 501, # Ƶ ƶ + 0x01b7, 719, # Ʒ ʒ + 0x01b8, 501, # Ƹ ƹ + 0x01bc, 501, # Ƽ ƽ + 0x01c4, 502, # DŽ dž + 0x01c5, 501, # Dž dž + 0x01c7, 502, # LJ lj + 0x01c8, 501, # Lj lj + 0x01ca, 502, # NJ nj + 0x01cb, 501, # Nj nj + 0x01cd, 501, # Ǎ ǎ + 0x01cf, 501, # Ǐ ǐ + 0x01d1, 501, # Ǒ ǒ + 0x01d3, 501, # Ǔ ǔ + 0x01d5, 501, # Ǖ ǖ + 0x01d7, 501, # Ǘ ǘ + 0x01d9, 501, # Ǚ ǚ + 0x01db, 501, # Ǜ ǜ + 0x01de, 501, # Ǟ ǟ + 0x01e0, 501, # Ǡ ǡ + 0x01e2, 501, # Ǣ ǣ + 0x01e4, 501, # Ǥ ǥ + 0x01e6, 501, # Ǧ ǧ + 0x01e8, 501, # Ǩ ǩ + 0x01ea, 501, # Ǫ ǫ + 0x01ec, 501, # Ǭ ǭ + 0x01ee, 501, # Ǯ ǯ + 0x01f1, 502, # DZ dz + 0x01f2, 501, # Dz dz + 0x01f4, 501, # Ǵ ǵ + 0x01fa, 501, # Ǻ ǻ + 0x01fc, 501, # Ǽ ǽ + 0x01fe, 501, # Ǿ ǿ + 0x0200, 501, # Ȁ ȁ + 0x0202, 501, # Ȃ ȃ + 0x0204, 501, # Ȅ ȅ + 0x0206, 501, # Ȇ ȇ + 0x0208, 501, # Ȉ ȉ + 0x020a, 501, # Ȋ ȋ + 0x020c, 501, # Ȍ ȍ + 0x020e, 501, # Ȏ ȏ + 0x0210, 501, # Ȑ ȑ + 0x0212, 501, # Ȓ ȓ + 0x0214, 501, # Ȕ ȕ + 0x0216, 501, # Ȗ ȗ + 0x0386, 538, # Ά ά + 0x038c, 564, # Ό ό + 0x03e2, 501, # Ϣ ϣ + 0x03e4, 501, # Ϥ ϥ + 0x03e6, 501, # Ϧ ϧ + 0x03e8, 501, # Ϩ ϩ + 0x03ea, 501, # Ϫ ϫ + 0x03ec, 501, # Ϭ ϭ + 0x03ee, 501, # Ϯ ϯ + 0x0460, 501, # Ѡ ѡ + 0x0462, 501, # Ѣ ѣ + 0x0464, 501, # Ѥ ѥ + 0x0466, 501, # Ѧ ѧ + 0x0468, 501, # Ѩ ѩ + 0x046a, 501, # Ѫ ѫ + 0x046c, 501, # Ѭ ѭ + 0x046e, 501, # Ѯ ѯ + 0x0470, 501, # Ѱ ѱ + 0x0472, 501, # Ѳ ѳ + 0x0474, 501, # Ѵ ѵ + 0x0476, 501, # Ѷ ѷ + 0x0478, 501, # Ѹ ѹ + 0x047a, 501, # Ѻ ѻ + 0x047c, 501, # Ѽ ѽ + 0x047e, 501, # Ѿ ѿ + 0x0480, 501, # Ҁ ҁ + 0x0490, 501, # Ґ ґ + 0x0492, 501, # Ғ ғ + 0x0494, 501, # Ҕ ҕ + 0x0496, 501, # Җ җ + 0x0498, 501, # Ҙ ҙ + 0x049a, 501, # Қ қ + 0x049c, 501, # Ҝ ҝ + 0x049e, 501, # Ҟ ҟ + 0x04a0, 501, # Ҡ ҡ + 0x04a2, 501, # Ң ң + 0x04a4, 501, # Ҥ ҥ + 0x04a6, 501, # Ҧ ҧ + 0x04a8, 501, # Ҩ ҩ + 0x04aa, 501, # Ҫ ҫ + 0x04ac, 501, # Ҭ ҭ + 0x04ae, 501, # Ү ү + 0x04b0, 501, # Ұ ұ + 0x04b2, 501, # Ҳ ҳ + 0x04b4, 501, # Ҵ ҵ + 0x04b6, 501, # Ҷ ҷ + 0x04b8, 501, # Ҹ ҹ + 0x04ba, 501, # Һ һ + 0x04bc, 501, # Ҽ ҽ + 0x04be, 501, # Ҿ ҿ + 0x04c1, 501, # Ӂ ӂ + 0x04c3, 501, # Ӄ ӄ + 0x04c7, 501, # Ӈ ӈ + 0x04cb, 501, # Ӌ ӌ + 0x04d0, 501, # Ӑ ӑ + 0x04d2, 501, # Ӓ ӓ + 0x04d4, 501, # Ӕ ӕ + 0x04d6, 501, # Ӗ ӗ + 0x04d8, 501, # Ә ә + 0x04da, 501, # Ӛ ӛ + 0x04dc, 501, # Ӝ ӝ + 0x04de, 501, # Ӟ ӟ + 0x04e0, 501, # Ӡ ӡ + 0x04e2, 501, # Ӣ ӣ + 0x04e4, 501, # Ӥ ӥ + 0x04e6, 501, # Ӧ ӧ + 0x04e8, 501, # Ө ө + 0x04ea, 501, # Ӫ ӫ + 0x04ee, 501, # Ӯ ӯ + 0x04f0, 501, # Ӱ ӱ + 0x04f2, 501, # Ӳ ӳ + 0x04f4, 501, # Ӵ ӵ + 0x04f8, 501, # Ӹ ӹ + 0x1e00, 501, # Ḁ ḁ + 0x1e02, 501, # Ḃ ḃ + 0x1e04, 501, # Ḅ ḅ + 0x1e06, 501, # Ḇ ḇ + 0x1e08, 501, # Ḉ ḉ + 0x1e0a, 501, # Ḋ ḋ + 0x1e0c, 501, # Ḍ ḍ + 0x1e0e, 501, # Ḏ ḏ + 0x1e10, 501, # Ḑ ḑ + 0x1e12, 501, # Ḓ ḓ + 0x1e14, 501, # Ḕ ḕ + 0x1e16, 501, # Ḗ ḗ + 0x1e18, 501, # Ḙ ḙ + 0x1e1a, 501, # Ḛ ḛ + 0x1e1c, 501, # Ḝ ḝ + 0x1e1e, 501, # Ḟ ḟ + 0x1e20, 501, # Ḡ ḡ + 0x1e22, 501, # Ḣ ḣ + 0x1e24, 501, # Ḥ ḥ + 0x1e26, 501, # Ḧ ḧ + 0x1e28, 501, # Ḩ ḩ + 0x1e2a, 501, # Ḫ ḫ + 0x1e2c, 501, # Ḭ ḭ + 0x1e2e, 501, # Ḯ ḯ + 0x1e30, 501, # Ḱ ḱ + 0x1e32, 501, # Ḳ ḳ + 0x1e34, 501, # Ḵ ḵ + 0x1e36, 501, # Ḷ ḷ + 0x1e38, 501, # Ḹ ḹ + 0x1e3a, 501, # Ḻ ḻ + 0x1e3c, 501, # Ḽ ḽ + 0x1e3e, 501, # Ḿ ḿ + 0x1e40, 501, # Ṁ ṁ + 0x1e42, 501, # Ṃ ṃ + 0x1e44, 501, # Ṅ ṅ + 0x1e46, 501, # Ṇ ṇ + 0x1e48, 501, # Ṉ ṉ + 0x1e4a, 501, # Ṋ ṋ + 0x1e4c, 501, # Ṍ ṍ + 0x1e4e, 501, # Ṏ ṏ + 0x1e50, 501, # Ṑ ṑ + 0x1e52, 501, # Ṓ ṓ + 0x1e54, 501, # Ṕ ṕ + 0x1e56, 501, # Ṗ ṗ + 0x1e58, 501, # Ṙ ṙ + 0x1e5a, 501, # Ṛ ṛ + 0x1e5c, 501, # Ṝ ṝ + 0x1e5e, 501, # Ṟ ṟ + 0x1e60, 501, # Ṡ ṡ + 0x1e62, 501, # Ṣ ṣ + 0x1e64, 501, # Ṥ ṥ + 0x1e66, 501, # Ṧ ṧ + 0x1e68, 501, # Ṩ ṩ + 0x1e6a, 501, # Ṫ ṫ + 0x1e6c, 501, # Ṭ ṭ + 0x1e6e, 501, # Ṯ ṯ + 0x1e70, 501, # Ṱ ṱ + 0x1e72, 501, # Ṳ ṳ + 0x1e74, 501, # Ṵ ṵ + 0x1e76, 501, # Ṷ ṷ + 0x1e78, 501, # Ṹ ṹ + 0x1e7a, 501, # Ṻ ṻ + 0x1e7c, 501, # Ṽ ṽ + 0x1e7e, 501, # Ṿ ṿ + 0x1e80, 501, # Ẁ ẁ + 0x1e82, 501, # Ẃ ẃ + 0x1e84, 501, # Ẅ ẅ + 0x1e86, 501, # Ẇ ẇ + 0x1e88, 501, # Ẉ ẉ + 0x1e8a, 501, # Ẋ ẋ + 0x1e8c, 501, # Ẍ ẍ + 0x1e8e, 501, # Ẏ ẏ + 0x1e90, 501, # Ẑ ẑ + 0x1e92, 501, # Ẓ ẓ + 0x1e94, 501, # Ẕ ẕ + 0x1ea0, 501, # Ạ ạ + 0x1ea2, 501, # Ả ả + 0x1ea4, 501, # Ấ ấ + 0x1ea6, 501, # Ầ ầ + 0x1ea8, 501, # Ẩ ẩ + 0x1eaa, 501, # Ẫ ẫ + 0x1eac, 501, # Ậ ậ + 0x1eae, 501, # Ắ ắ + 0x1eb0, 501, # Ằ ằ + 0x1eb2, 501, # Ẳ ẳ + 0x1eb4, 501, # Ẵ ẵ + 0x1eb6, 501, # Ặ ặ + 0x1eb8, 501, # Ẹ ẹ + 0x1eba, 501, # Ẻ ẻ + 0x1ebc, 501, # Ẽ ẽ + 0x1ebe, 501, # Ế ế + 0x1ec0, 501, # Ề ề + 0x1ec2, 501, # Ể ể + 0x1ec4, 501, # Ễ ễ + 0x1ec6, 501, # Ệ ệ + 0x1ec8, 501, # Ỉ ỉ + 0x1eca, 501, # Ị ị + 0x1ecc, 501, # Ọ ọ + 0x1ece, 501, # Ỏ ỏ + 0x1ed0, 501, # Ố ố + 0x1ed2, 501, # Ồ ồ + 0x1ed4, 501, # Ổ ổ + 0x1ed6, 501, # Ỗ ỗ + 0x1ed8, 501, # Ộ ộ + 0x1eda, 501, # Ớ ớ + 0x1edc, 501, # Ờ ờ + 0x1ede, 501, # Ở ở + 0x1ee0, 501, # Ỡ ỡ + 0x1ee2, 501, # Ợ ợ + 0x1ee4, 501, # Ụ ụ + 0x1ee6, 501, # Ủ ủ + 0x1ee8, 501, # Ứ ứ + 0x1eea, 501, # Ừ ừ + 0x1eec, 501, # Ử ử + 0x1eee, 501, # Ữ ữ + 0x1ef0, 501, # Ự ự + 0x1ef2, 501, # Ỳ ỳ + 0x1ef4, 501, # Ỵ ỵ + 0x1ef6, 501, # Ỷ ỷ + 0x1ef8, 501, # Ỹ ỹ + 0x1f59, 492, # Ὑ ὑ + 0x1f5b, 492, # Ὓ ὓ + 0x1f5d, 492, # Ὕ ὕ + 0x1f5f, 492, # Ὗ ὗ + 0x1fbc, 491, # ᾼ ᾳ + 0x1fcc, 491, # ῌ ῃ + 0x1fec, 493, # Ῥ ῥ + 0x1ffc, 491] # ῼ ῳ + + toTitleSinglets = [ + 0x01c4, 501, # DŽ Dž + 0x01c6, 499, # dž Dž + 0x01c7, 501, # LJ Lj + 0x01c9, 499, # lj Lj + 0x01ca, 501, # NJ Nj + 0x01cc, 499, # nj Nj + 0x01f1, 501, # DZ Dz + 0x01f3, 499] # dz Dz + +proc binarySearch(c: TRune, tab: openArray[TRune], len, stride: int): int = + var n = len + var t = 0 + while n > 1: + var m = n div 2 + var p = t + m*stride + if c >= tab[p]: + t = p + n = n-m + else: + n = m + if n != 0 and c >= tab[t]: + return t + return -1 + +proc toLower*(c: TRune): TRune = + ## Converts `c` into lower case. This works for any Unicode character. + var p = binarySearch(c, tolowerRanges, len(toLowerRanges) div 3, 3) + if p >= 0 and c >= tolowerRanges[p] and c <= tolowerRanges[p+1]: + return c + tolowerRanges[p+2] - 500 + p = binarySearch(c, toLowerSinglets, len(toLowerSinglets) div 2, 2) + if p >= 0 and c == toLowerSinglets[p]: + return c + toLowerSinglets[p+1] - 500 + return c + +proc toUpper*(c: TRune): TRune = + ## Converts `c` into upper case. This works for any Unicode character. + var p = binarySearch(c, toUpperRanges, len(toUpperRanges) div 3, 3) + if p >= 0 and c >= toUpperRanges[p] and c <= toUpperRanges[p+1]: + return c + toUpperRanges[p+2] - 500 + p = binarySearch(c, toUpperSinglets, len(toUpperSinglets) div 2, 2) + if p >= 0 and c == toUpperSinglets[p]: + return c + toUpperSinglets[p+1] - 500 + return c + +proc toTitle*(c: TRune): TRune = + var p = binarySearch(c, toTitleSinglets, len(toTitleSinglets) div 2, 2) + if p >= 0 and c == toTitleSinglets[p]: + return c + toTitleSinglets[p+1] - 500 + return c + +proc isLower*(c: TRune): bool = + ## returns true iff `c` is a lower case Unicode character + # Note: toUpperRanges is correct here! + var p = binarySearch(c, toUpperRanges, len(toUpperRanges) div 3, 3) + if p >= 0 and c >= toUpperRanges[p] and c <= toUpperRanges[p+1]: + return true + p = binarySearch(c, toUpperSinglets, len(toUpperSinglets) div 2, 2) + if p >= 0 and c == toUpperSinglets[p]: + return true + +proc isUpper*(c: TRune): bool = + ## returns true iff `c` is a upper case Unicode character + # Note: toLowerRanges is correct here! + var p = binarySearch(c, toLowerRanges, len(toLowerRanges) div 3, 3) + if p >= 0 and c >= toLowerRanges[p] and c <= toLowerRanges[p+1]: + return true + p = binarySearch(c, toLowerSinglets, len(toLowerSinglets) div 2, 2) + if p >= 0 and c == toLowerSinglets[p]: + return true + +proc isAlpha*(c: TRune): bool = + ## returns true iff `c` is an *alpha* Unicode character (i.e. a letter) + if isUpper(c) or isLower(c): + return true + var p = binarySearch(c, alphaRanges, len(alphaRanges) div 2, 2) + if p >= 0 and c >= alphaRanges[p] and c <= alphaRanges[p+1]: + return true + p = binarySearch(c, alphaSinglets, len(alphaSinglets), 1) + if p >= 0 and c == alphaSinglets[p]: + return true + +proc isTitle*(c: TRune): bool = + return isUpper(c) and isLower(c) + +proc isWhiteSpace*(c: TRune): bool = + ## returns true iff `c` is a Unicode whitespace character + var p = binarySearch(c, spaceRanges, len(spaceRanges) div 2, 2) + if p >= 0 and c >= spaceRanges[p] and c <= spaceRanges[p+1]: + return true + +iterator runes*(s: string): TRune = ## iterates over any unicode character of the string `s`. var i = 0 - result: TUniChar + result: TRune while i < len(s): - if ord(s[i]) <= 127: - result = ord(s[i]) - inc(i) - elif ord(s[i]) shr 5 == 0b110: - result = (ord(s[i]) and ones(5)) shl 6 or (ord(s[i+1]) and ones(6)) - inc(i, 2) - elif ord(s[i]) shr 4 == 0b1110: - result = (ord(s[i]) and ones(4)) shl 12 or - (ord(s[i+1]) and ones(6)) shl 6 or - (ord(s[i+2]) and ones(6)) - inc(i, 3) - elif ord(s[i]) shr 3 == 0b11110: - result = (ord(s[i]) and ones(3)) shl 18 or - (ord(s[i+1]) and ones(6)) shl 12 or - (ord(s[i+2]) and ones(6)) shl 6 or - (ord(s[i+3]) and ones(6)) - inc(i, 4) - else: - assert(false) + fastRuneAt(s, i, result) yield result - -type - TCharacterSet = enum - cs8859_1, cs8859_2 - -const - characterSetToName: array [TCharacterSet, string] = [ - "ISO/IEC 8859-1:1998", - "ISO 8859-2:1999", - "", - "" - ] - - cs8859_2toUnicode: array [0xA1..0xff, TUniChar16] = [ - 0x0104'i16, 0x02D8'i16, 0x0141'i16, 0x00A4'i16, 0x013D'i16, 0x015A'i16, - 0x00A7'i16, 0x00A8'i16, 0x0160'i16, 0x015E'i16, 0x0164'i16, 0x0179'i16, - 0x00AD'i16, 0x017D'i16, 0x017B'i16, 0x00B0'i16, 0x0105'i16, 0x02DB'i16, - 0x0142'i16, 0x00B4'i16, 0x013E'i16, 0x015B'i16, 0x02C7'i16, 0x00B8'i16, - 0x0161'i16, 0x015F'i16, 0x0165'i16, 0x017A'i16, 0x02DD'i16, 0x017E'i16, - 0x017C'i16, 0x0154'i16, 0x00C1'i16, 0x00C2'i16, 0x0102'i16, 0x00C4'i16, - 0x0139'i16, 0x0106'i16, 0x00C7'i16, 0x010C'i16, 0x00C9'i16, 0x0118'i16, - 0x00CB'i16, 0x011A'i16, 0x00CD'i16, 0x00CE'i16, 0x010E'i16, 0x0110'i16, - 0x0143'i16, 0x0147'i16, 0x00D3'i16, 0x00D4'i16, 0x0150'i16, 0x00D6'i16, - 0x00D7'i16, 0x0158'i16, 0x016E'i16, 0x00DA'i16, 0x0170'i16, 0x00DC'i16, - 0x00DD'i16, 0x0162'i16, 0x00DF'i16, 0x0155'i16, 0x00E1'i16, 0x00E2'i16, - 0x0103'i16, 0x00E4'i16, 0x013A'i16, 0x0107'i16, 0x00E7'i16, 0x010D'i16, - 0x00E9'i16, 0x0119'i16, 0x00EB'i16, 0x011B'i16, 0x00ED'i16, 0x00EE'i16, - 0x010F'i16, 0x0111'i16, 0x0144'i16, 0x0148'i16, 0x00F3'i16, 0x00F4'i16, - 0x0151'i16, 0x00F6'i16, 0x00F7'i16, 0x0159'i16, 0x016F'i16, 0x00FA'i16, - 0x0171'i16, 0x00FC'i16, 0x00FD'i16, 0x0163'i16, 0x02D9'i16] - -proc searchTable(tab: openarray[TUniChar16], u: TUniChar16): int8 = - var idx = find(tab, u) - assert(idx > 0) - result = toU8(idx) - -proc csToUnicode(cs: TCharacterSet, c: int8): TUniChar16 = - case cs - of cs8859_1: result = ze16(c) # no table lookup necessary - of cs8859_2: - if c <=% 0xA0'i8: - result = ze16(c) - else: - result = cs8859_2toUnicode[ze(c)] -proc unicodeToCS(cs: TCharacterSet, u: TUniChar16): int8 = - case cs - of cs8859_1: result = toU8(u) # no table lookup necessary - of cs8859_2: - if u <=% 0x00A0'i16: - result = toU8(u) - else: - result = searchTable(cs8859_2toUnicode, u) +% 0xA1'8 - -proc utf8toLocale*(s: string): string -proc localeToUtf8*(s: string): string - -proc utf8toUtf16*(s: string): seq[TUniChar16] -proc utf8toUcs4*(s: string): seq[TUniChar] = - result = [] - for u in unichars(s): - -proc ucs4ToUtf8(s: seq[TUnichar]): string -proc utf16ToUtf8(s: seq[TUnichar16]): string -proc ucs4toUft16(s: seq[TUnichar]): seq[TUnichar16] -proc uft16toUcs4(s: seq[Tunichar16]): seq[TUnichar] - -proc cmpUnicode*(a, b: string): int = - ## treats `a` and `b` as UTF-8 strings and compares them. Returns: +proc cmpRunesIgnoreCase*(a, b: string): int = + ## compares two UTF8 strings and ignores the case. Returns: + ## + ## | 0 iff a == b ## | < 0 iff a < b ## | > 0 iff a > b - ## | == 0 iff a == b - ## This routine is useful for sorting UTF-8 strings. - return -1 - + var i = 0 + var j = 0 + var ar, br: TRune + while i < a.len and j < b.len: + # slow path: + fastRuneAt(a, i, ar) + fastRuneAt(b, j, br) + result = toLower(ar) - toLower(br) + if result != 0: return + result = a.len - b.len + diff --git a/lib/windows/windows.nim b/lib/windows/windows.nim index 2ac5fd7b6..ea650e80a 100644 --- a/lib/windows/windows.nim +++ b/lib/windows/windows.nim @@ -10,6 +10,8 @@ ## Define ``winUnicode`` before importing this module for the ## unicode version. +{.deadCodeElim: on.} + type ATOM* = int16 TAtom* = ATOM diff --git a/makefile b/makefile index 75ac2d09b..75507969c 100644 --- a/makefile +++ b/makefile @@ -7,7 +7,7 @@ all: .PHONY : install install: - sh install.sh /usr/bin + sh build.sh .PHONY : clean clean: diff --git a/nim/ast.pas b/nim/ast.pas index be967a568..c22385805 100644 --- a/nim/ast.pas +++ b/nim/ast.pas @@ -65,148 +65,148 @@ for key, val in enums.items(): cog.out(a) cog.out(b) ]]]*) -type - TTypeFlag = ( - tfVarargs, tfFinal, tfAcyclic, tfEnumHasWholes); - TTypeFlags = set of TTypeFlag; -const - TypeFlagToStr: array [TTypeFlag] of string = ( - 'tfVarargs', 'tfFinal', 'tfAcyclic', 'tfEnumHasWholes'); -type - TTypeKind = ( - tyNone, tyBool, tyChar, tyEmpty, - tyArrayConstr, tyNil, tyGeneric, tyGenericInst, - tyGenericParam, tyEnum, tyAnyEnum, tyArray, - tyObject, tyTuple, tySet, tyRange, - tyPtr, tyRef, tyVar, tySequence, - tyProc, tyPointer, tyOpenArray, tyString, - tyCString, tyForward, tyInt, tyInt8, - tyInt16, tyInt32, tyInt64, tyFloat, - tyFloat32, tyFloat64, tyFloat128); - TTypeKinds = set of TTypeKind; -const - TypeKindToStr: array [TTypeKind] of string = ( - 'tyNone', 'tyBool', 'tyChar', 'tyEmpty', - 'tyArrayConstr', 'tyNil', 'tyGeneric', 'tyGenericInst', - 'tyGenericParam', 'tyEnum', 'tyAnyEnum', 'tyArray', - 'tyObject', 'tyTuple', 'tySet', 'tyRange', - 'tyPtr', 'tyRef', 'tyVar', 'tySequence', - 'tyProc', 'tyPointer', 'tyOpenArray', 'tyString', - 'tyCString', 'tyForward', 'tyInt', 'tyInt8', - 'tyInt16', 'tyInt32', 'tyInt64', 'tyFloat', - 'tyFloat32', 'tyFloat64', 'tyFloat128'); -type - TSymFlag = ( - sfUsed, sfStar, sfMinus, sfInInterface, - sfFromGeneric, sfGlobal, sfForward, sfImportc, - sfExportc, sfVolatile, sfRegister, sfPure, - sfResult, sfNoSideEffect, sfMainModule, sfSystemModule, - sfNoReturn, sfAddrTaken, sfCompilerProc, sfCppMethod, - sfDiscriminant, sfDeprecated, sfInClosure, sfTypeCheck, - sfCompileTime, sfThreadVar, sfMerge); - TSymFlags = set of TSymFlag; -const - SymFlagToStr: array [TSymFlag] of string = ( - 'sfUsed', 'sfStar', 'sfMinus', 'sfInInterface', - 'sfFromGeneric', 'sfGlobal', 'sfForward', 'sfImportc', - 'sfExportc', 'sfVolatile', 'sfRegister', 'sfPure', - 'sfResult', 'sfNoSideEffect', 'sfMainModule', 'sfSystemModule', - 'sfNoReturn', 'sfAddrTaken', 'sfCompilerProc', 'sfCppMethod', - 'sfDiscriminant', 'sfDeprecated', 'sfInClosure', 'sfTypeCheck', - 'sfCompileTime', 'sfThreadVar', 'sfMerge'); -type - TNodeFlag = ( - nfNone, nfBase2, nfBase8, nfBase16, - nfAllConst, nfTransf, nfSem); - TNodeFlags = set of TNodeFlag; -const - NodeFlagToStr: array [TNodeFlag] of string = ( - 'nfNone', 'nfBase2', 'nfBase8', 'nfBase16', - 'nfAllConst', 'nfTransf', 'nfSem'); -type - TSymKind = ( - skUnknownSym, skConditional, skDynLib, skParam, - skTypeParam, skTemp, skType, skConst, - skVar, skProc, skIterator, skConverter, - skMacro, skTemplate, skField, skEnumField, - skForVar, skModule, skLabel, skStub); - TSymKinds = set of TSymKind; -const - SymKindToStr: array [TSymKind] of string = ( - 'skUnknownSym', 'skConditional', 'skDynLib', 'skParam', - 'skTypeParam', 'skTemp', 'skType', 'skConst', - 'skVar', 'skProc', 'skIterator', 'skConverter', - 'skMacro', 'skTemplate', 'skField', 'skEnumField', - 'skForVar', 'skModule', 'skLabel', 'skStub'); -type - TNodeKind = ( - nkNone, nkEmpty, nkIdent, nkSym, - nkType, nkCharLit, nkIntLit, nkInt8Lit, - nkInt16Lit, nkInt32Lit, nkInt64Lit, nkFloatLit, - nkFloat32Lit, nkFloat64Lit, nkStrLit, nkRStrLit, - nkTripleStrLit, nkMetaNode, nkNilLit, nkDotCall, - nkCommand, nkCall, nkGenericCall, nkExplicitTypeListCall, - nkExprEqExpr, nkExprColonExpr, nkIdentDefs, nkInfix, - nkPrefix, nkPostfix, nkPar, nkCurly, - nkBracket, nkBracketExpr, nkPragmaExpr, nkRange, - nkDotExpr, nkCheckedFieldExpr, nkDerefExpr, nkIfExpr, - nkElifExpr, nkElseExpr, nkLambda, nkAccQuoted, - nkHeaderQuoted, nkTableConstr, nkQualified, nkHiddenStdConv, - nkHiddenSubConv, nkHiddenCallConv, nkConv, nkCast, - nkAddr, nkHiddenAddr, nkHiddenDeref, nkObjDownConv, - nkObjUpConv, nkChckRangeF, nkChckRange64, nkChckRange, - nkStringToCString, nkCStringToString, nkPassAsOpenArray, nkAsgn, - nkDefaultTypeParam, nkGenericParams, nkFormalParams, nkOfInherit, - nkModule, nkProcDef, nkConverterDef, nkMacroDef, - nkTemplateDef, nkIteratorDef, nkOfBranch, nkElifBranch, - nkExceptBranch, nkElse, nkMacroStmt, nkAsmStmt, - nkPragma, nkIfStmt, nkWhenStmt, nkForStmt, - nkWhileStmt, nkCaseStmt, nkVarSection, nkConstSection, - nkConstDef, nkTypeSection, nkTypeDef, nkYieldStmt, - nkTryStmt, nkFinally, nkRaiseStmt, nkReturnStmt, - nkBreakStmt, nkContinueStmt, nkBlockStmt, nkDiscardStmt, - nkStmtList, nkImportStmt, nkFromStmt, nkImportAs, - nkIncludeStmt, nkAccessStmt, nkCommentStmt, nkStmtListExpr, - nkBlockExpr, nkStmtListType, nkBlockType, nkVm, - nkTypeOfExpr, nkObjectTy, nkTupleTy, nkRecList, - nkRecCase, nkRecWhen, nkRefTy, nkPtrTy, - nkVarTy, nkProcTy, nkEnumTy, nkEnumFieldDef, - nkReturnToken); - TNodeKinds = set of TNodeKind; -const - NodeKindToStr: array [TNodeKind] of string = ( - 'nkNone', 'nkEmpty', 'nkIdent', 'nkSym', - 'nkType', 'nkCharLit', 'nkIntLit', 'nkInt8Lit', - 'nkInt16Lit', 'nkInt32Lit', 'nkInt64Lit', 'nkFloatLit', - 'nkFloat32Lit', 'nkFloat64Lit', 'nkStrLit', 'nkRStrLit', - 'nkTripleStrLit', 'nkMetaNode', 'nkNilLit', 'nkDotCall', - 'nkCommand', 'nkCall', 'nkGenericCall', 'nkExplicitTypeListCall', - 'nkExprEqExpr', 'nkExprColonExpr', 'nkIdentDefs', 'nkInfix', - 'nkPrefix', 'nkPostfix', 'nkPar', 'nkCurly', - 'nkBracket', 'nkBracketExpr', 'nkPragmaExpr', 'nkRange', - 'nkDotExpr', 'nkCheckedFieldExpr', 'nkDerefExpr', 'nkIfExpr', - 'nkElifExpr', 'nkElseExpr', 'nkLambda', 'nkAccQuoted', - 'nkHeaderQuoted', 'nkTableConstr', 'nkQualified', 'nkHiddenStdConv', - 'nkHiddenSubConv', 'nkHiddenCallConv', 'nkConv', 'nkCast', - 'nkAddr', 'nkHiddenAddr', 'nkHiddenDeref', 'nkObjDownConv', - 'nkObjUpConv', 'nkChckRangeF', 'nkChckRange64', 'nkChckRange', - 'nkStringToCString', 'nkCStringToString', 'nkPassAsOpenArray', 'nkAsgn', - 'nkDefaultTypeParam', 'nkGenericParams', 'nkFormalParams', 'nkOfInherit', - 'nkModule', 'nkProcDef', 'nkConverterDef', 'nkMacroDef', - 'nkTemplateDef', 'nkIteratorDef', 'nkOfBranch', 'nkElifBranch', - 'nkExceptBranch', 'nkElse', 'nkMacroStmt', 'nkAsmStmt', - 'nkPragma', 'nkIfStmt', 'nkWhenStmt', 'nkForStmt', - 'nkWhileStmt', 'nkCaseStmt', 'nkVarSection', 'nkConstSection', - 'nkConstDef', 'nkTypeSection', 'nkTypeDef', 'nkYieldStmt', - 'nkTryStmt', 'nkFinally', 'nkRaiseStmt', 'nkReturnStmt', - 'nkBreakStmt', 'nkContinueStmt', 'nkBlockStmt', 'nkDiscardStmt', - 'nkStmtList', 'nkImportStmt', 'nkFromStmt', 'nkImportAs', - 'nkIncludeStmt', 'nkAccessStmt', 'nkCommentStmt', 'nkStmtListExpr', - 'nkBlockExpr', 'nkStmtListType', 'nkBlockType', 'nkVm', - 'nkTypeOfExpr', 'nkObjectTy', 'nkTupleTy', 'nkRecList', - 'nkRecCase', 'nkRecWhen', 'nkRefTy', 'nkPtrTy', - 'nkVarTy', 'nkProcTy', 'nkEnumTy', 'nkEnumFieldDef', - 'nkReturnToken'); +type + TNodeKind = ( + nkNone, nkEmpty, nkIdent, nkSym, + nkType, nkCharLit, nkIntLit, nkInt8Lit, + nkInt16Lit, nkInt32Lit, nkInt64Lit, nkFloatLit, + nkFloat32Lit, nkFloat64Lit, nkStrLit, nkRStrLit, + nkTripleStrLit, nkMetaNode, nkNilLit, nkDotCall, + nkCommand, nkCall, nkGenericCall, nkExplicitTypeListCall, + nkExprEqExpr, nkExprColonExpr, nkIdentDefs, nkVarTuple, + nkInfix, nkPrefix, nkPostfix, nkPar, + nkCurly, nkBracket, nkBracketExpr, nkPragmaExpr, + nkRange, nkDotExpr, nkCheckedFieldExpr, nkDerefExpr, + nkIfExpr, nkElifExpr, nkElseExpr, nkLambda, + nkAccQuoted, nkHeaderQuoted, nkTableConstr, nkQualified, + nkHiddenStdConv, nkHiddenSubConv, nkHiddenCallConv, nkConv, + nkCast, nkAddr, nkHiddenAddr, nkHiddenDeref, + nkObjDownConv, nkObjUpConv, nkChckRangeF, nkChckRange64, + nkChckRange, nkStringToCString, nkCStringToString, nkPassAsOpenArray, + nkAsgn, nkFastAsgn, nkDefaultTypeParam, nkGenericParams, + nkFormalParams, nkOfInherit, nkModule, nkProcDef, + nkConverterDef, nkMacroDef, nkTemplateDef, nkIteratorDef, + nkOfBranch, nkElifBranch, nkExceptBranch, nkElse, + nkMacroStmt, nkAsmStmt, nkPragma, nkIfStmt, + nkWhenStmt, nkForStmt, nkWhileStmt, nkCaseStmt, + nkVarSection, nkConstSection, nkConstDef, nkTypeSection, + nkTypeDef, nkYieldStmt, nkTryStmt, nkFinally, + nkRaiseStmt, nkReturnStmt, nkBreakStmt, nkContinueStmt, + nkBlockStmt, nkDiscardStmt, nkStmtList, nkImportStmt, + nkFromStmt, nkImportAs, nkIncludeStmt, nkAccessStmt, + nkCommentStmt, nkStmtListExpr, nkBlockExpr, nkStmtListType, + nkBlockType, nkVm, nkTypeOfExpr, nkObjectTy, + nkTupleTy, nkRecList, nkRecCase, nkRecWhen, + nkRefTy, nkPtrTy, nkVarTy, nkProcTy, + nkEnumTy, nkEnumFieldDef, nkReturnToken); + TNodeKinds = set of TNodeKind; +const + NodeKindToStr: array [TNodeKind] of string = ( + 'nkNone', 'nkEmpty', 'nkIdent', 'nkSym', + 'nkType', 'nkCharLit', 'nkIntLit', 'nkInt8Lit', + 'nkInt16Lit', 'nkInt32Lit', 'nkInt64Lit', 'nkFloatLit', + 'nkFloat32Lit', 'nkFloat64Lit', 'nkStrLit', 'nkRStrLit', + 'nkTripleStrLit', 'nkMetaNode', 'nkNilLit', 'nkDotCall', + 'nkCommand', 'nkCall', 'nkGenericCall', 'nkExplicitTypeListCall', + 'nkExprEqExpr', 'nkExprColonExpr', 'nkIdentDefs', 'nkVarTuple', + 'nkInfix', 'nkPrefix', 'nkPostfix', 'nkPar', + 'nkCurly', 'nkBracket', 'nkBracketExpr', 'nkPragmaExpr', + 'nkRange', 'nkDotExpr', 'nkCheckedFieldExpr', 'nkDerefExpr', + 'nkIfExpr', 'nkElifExpr', 'nkElseExpr', 'nkLambda', + 'nkAccQuoted', 'nkHeaderQuoted', 'nkTableConstr', 'nkQualified', + 'nkHiddenStdConv', 'nkHiddenSubConv', 'nkHiddenCallConv', 'nkConv', + 'nkCast', 'nkAddr', 'nkHiddenAddr', 'nkHiddenDeref', + 'nkObjDownConv', 'nkObjUpConv', 'nkChckRangeF', 'nkChckRange64', + 'nkChckRange', 'nkStringToCString', 'nkCStringToString', 'nkPassAsOpenArray', + 'nkAsgn', 'nkFastAsgn', 'nkDefaultTypeParam', 'nkGenericParams', + 'nkFormalParams', 'nkOfInherit', 'nkModule', 'nkProcDef', + 'nkConverterDef', 'nkMacroDef', 'nkTemplateDef', 'nkIteratorDef', + 'nkOfBranch', 'nkElifBranch', 'nkExceptBranch', 'nkElse', + 'nkMacroStmt', 'nkAsmStmt', 'nkPragma', 'nkIfStmt', + 'nkWhenStmt', 'nkForStmt', 'nkWhileStmt', 'nkCaseStmt', + 'nkVarSection', 'nkConstSection', 'nkConstDef', 'nkTypeSection', + 'nkTypeDef', 'nkYieldStmt', 'nkTryStmt', 'nkFinally', + 'nkRaiseStmt', 'nkReturnStmt', 'nkBreakStmt', 'nkContinueStmt', + 'nkBlockStmt', 'nkDiscardStmt', 'nkStmtList', 'nkImportStmt', + 'nkFromStmt', 'nkImportAs', 'nkIncludeStmt', 'nkAccessStmt', + 'nkCommentStmt', 'nkStmtListExpr', 'nkBlockExpr', 'nkStmtListType', + 'nkBlockType', 'nkVm', 'nkTypeOfExpr', 'nkObjectTy', + 'nkTupleTy', 'nkRecList', 'nkRecCase', 'nkRecWhen', + 'nkRefTy', 'nkPtrTy', 'nkVarTy', 'nkProcTy', + 'nkEnumTy', 'nkEnumFieldDef', 'nkReturnToken'); +type + TSymFlag = ( + sfUsed, sfStar, sfMinus, sfInInterface, + sfFromGeneric, sfGlobal, sfForward, sfImportc, + sfExportc, sfVolatile, sfRegister, sfPure, + sfResult, sfNoSideEffect, sfMainModule, sfSystemModule, + sfNoReturn, sfAddrTaken, sfCompilerProc, sfCppMethod, + sfDiscriminant, sfDeprecated, sfInClosure, sfTypeCheck, + sfCompileTime, sfThreadVar, sfMerge, sfDeadCodeElim); + TSymFlags = set of TSymFlag; +const + SymFlagToStr: array [TSymFlag] of string = ( + 'sfUsed', 'sfStar', 'sfMinus', 'sfInInterface', + 'sfFromGeneric', 'sfGlobal', 'sfForward', 'sfImportc', + 'sfExportc', 'sfVolatile', 'sfRegister', 'sfPure', + 'sfResult', 'sfNoSideEffect', 'sfMainModule', 'sfSystemModule', + 'sfNoReturn', 'sfAddrTaken', 'sfCompilerProc', 'sfCppMethod', + 'sfDiscriminant', 'sfDeprecated', 'sfInClosure', 'sfTypeCheck', + 'sfCompileTime', 'sfThreadVar', 'sfMerge', 'sfDeadCodeElim'); +type + TTypeKind = ( + tyNone, tyBool, tyChar, tyEmpty, + tyArrayConstr, tyNil, tyGeneric, tyGenericInst, + tyGenericParam, tyEnum, tyAnyEnum, tyArray, + tyObject, tyTuple, tySet, tyRange, + tyPtr, tyRef, tyVar, tySequence, + tyProc, tyPointer, tyOpenArray, tyString, + tyCString, tyForward, tyInt, tyInt8, + tyInt16, tyInt32, tyInt64, tyFloat, + tyFloat32, tyFloat64, tyFloat128); + TTypeKinds = set of TTypeKind; +const + TypeKindToStr: array [TTypeKind] of string = ( + 'tyNone', 'tyBool', 'tyChar', 'tyEmpty', + 'tyArrayConstr', 'tyNil', 'tyGeneric', 'tyGenericInst', + 'tyGenericParam', 'tyEnum', 'tyAnyEnum', 'tyArray', + 'tyObject', 'tyTuple', 'tySet', 'tyRange', + 'tyPtr', 'tyRef', 'tyVar', 'tySequence', + 'tyProc', 'tyPointer', 'tyOpenArray', 'tyString', + 'tyCString', 'tyForward', 'tyInt', 'tyInt8', + 'tyInt16', 'tyInt32', 'tyInt64', 'tyFloat', + 'tyFloat32', 'tyFloat64', 'tyFloat128'); +type + TNodeFlag = ( + nfNone, nfBase2, nfBase8, nfBase16, + nfAllConst, nfTransf, nfSem); + TNodeFlags = set of TNodeFlag; +const + NodeFlagToStr: array [TNodeFlag] of string = ( + 'nfNone', 'nfBase2', 'nfBase8', 'nfBase16', + 'nfAllConst', 'nfTransf', 'nfSem'); +type + TTypeFlag = ( + tfVarargs, tfFinal, tfAcyclic, tfEnumHasWholes); + TTypeFlags = set of TTypeFlag; +const + TypeFlagToStr: array [TTypeFlag] of string = ( + 'tfVarargs', 'tfFinal', 'tfAcyclic', 'tfEnumHasWholes'); +type + TSymKind = ( + skUnknownSym, skConditional, skDynLib, skParam, + skTypeParam, skTemp, skType, skConst, + skVar, skProc, skIterator, skConverter, + skMacro, skTemplate, skField, skEnumField, + skForVar, skModule, skLabel, skStub); + TSymKinds = set of TSymKind; +const + SymKindToStr: array [TSymKind] of string = ( + 'skUnknownSym', 'skConditional', 'skDynLib', 'skParam', + 'skTypeParam', 'skTemp', 'skType', 'skConst', + 'skVar', 'skProc', 'skIterator', 'skConverter', + 'skMacro', 'skTemplate', 'skField', 'skEnumField', + 'skForVar', 'skModule', 'skLabel', 'skStub'); {[[[end]]]} type @@ -219,43 +219,44 @@ type // if (i+1) % 6 == 0: cog.outl("") //cog.outl("m" + magics[-1]) //]]] - mNone, mDefined, mLow, mHigh, mSizeOf, mIs, - mSucc, mPred, mInc, mDec, mOrd, mNew, - mNewFinalize, mNewSeq, mRegisterFinalizer, mLengthOpenArray, mLengthStr, mLengthArray, - mLengthSeq, mIncl, mExcl, mCard, mChr, mGCref, - mGCunref, mAddI, mSubI, mMulI, mDivI, mModI, - mAddI64, mSubI64, mMulI64, mDivI64, mModI64, mShrI, - mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI, - mShrI64, mShlI64, mBitandI64, mBitorI64, mBitxorI64, mMinI64, - mMaxI64, mAddF64, mSubF64, mMulF64, mDivF64, mMinF64, - mMaxF64, mAddU, mSubU, mMulU, mDivU, mModU, - mAddU64, mSubU64, mMulU64, mDivU64, mModU64, mEqI, - mLeI, mLtI, mEqI64, mLeI64, mLtI64, mEqF64, - mLeF64, mLtF64, mLeU, mLtU, mLeU64, mLtU64, - mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, - mEqB, mLeB, mLtB, mEqRef, mEqProc, mEqUntracedRef, - mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI, mUnaryMinusI64, - mAbsI, mAbsI64, mNot, mUnaryPlusI, mBitnotI, mUnaryPlusI64, - mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64, - mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, - mToU32, mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, - mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, - mAnd, mOr, mEqStr, mLeStr, mLtStr, mEqSet, - mLeSet, mLtSet, mMulSet, mPlusSet, mMinusSet, mSymDiffSet, - mConStrStr, mConArrArr, mConArrT, mConTArr, mConTT, mSlice, - mAppendStrCh, mAppendStrStr, mAppendSeqElem, mAppendSeqSeq, mInRange, mInSet, - mAsgn, mRepr, mExit, mSetLengthStr, mSetLengthSeq, mAssert, - mSwap, mIsNil, mArrToSeq, mArray, mOpenArray, mRange, - mSet, mSeq, mInt, mInt8, mInt16, mInt32, - mInt64, mFloat, mFloat32, mFloat64, mBool, mChar, - mString, mCstring, mPointer, mAnyEnum, mEmptySet, mIntSetBaseType, - mNil, mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor, - mNimrodMinor, mNimrodPatch, mCpuEndian, mNaN, mInf, mNegInf, - mNLen, mNChild, mNSetChild, mNAdd, mNAddMultiple, mNDel, - mNKind, mNIntVal, mNFloatVal, mNSymbol, mNIdent, mNGetType, - mNStrVal, mNSetIntVal, mNSetFloatVal, mNSetSymbol, mNSetIdent, mNSetType, - mNSetStrVal, mNNewNimNode, mNCopyNimNode, mNCopyNimTree, mStrToIdent, mIdentToStr, - mEqIdent, mNHint, mNWarning, mNError + mNone, mDefined, mLow, mHigh, mSizeOf, mIs, + mSucc, mPred, mInc, mDec, mOrd, mNew, + mNewFinalize, mNewSeq, mRegisterFinalizer, mLengthOpenArray, mLengthStr, mLengthArray, + mLengthSeq, mIncl, mExcl, mCard, mChr, mGCref, + mGCunref, mAddI, mSubI, mMulI, mDivI, mModI, + mAddI64, mSubI64, mMulI64, mDivI64, mModI64, mShrI, + mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI, + mShrI64, mShlI64, mBitandI64, mBitorI64, mBitxorI64, mMinI64, + mMaxI64, mAddF64, mSubF64, mMulF64, mDivF64, mMinF64, + mMaxF64, mAddU, mSubU, mMulU, mDivU, mModU, + mAddU64, mSubU64, mMulU64, mDivU64, mModU64, mEqI, + mLeI, mLtI, mEqI64, mLeI64, mLtI64, mEqF64, + mLeF64, mLtF64, mLeU, mLtU, mLeU64, mLtU64, + mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, + mEqB, mLeB, mLtB, mEqRef, mEqProc, mEqUntracedRef, + mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI, mUnaryMinusI64, + mAbsI, mAbsI64, mNot, mUnaryPlusI, mBitnotI, mUnaryPlusI64, + mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64, + mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, + mToU32, mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, + mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, + mEnumToStr, mAnd, mOr, mEqStr, mLeStr, mLtStr, + mEqSet, mLeSet, mLtSet, mMulSet, mPlusSet, mMinusSet, + mSymDiffSet, mConStrStr, mConArrArr, mConArrT, mConTArr, mConTT, + mSlice, mAppendStrCh, mAppendStrStr, mAppendSeqElem, mAppendSeqSeq, mInRange, + mInSet, mAsgn, mRepr, mExit, mSetLengthStr, mSetLengthSeq, + mAssert, mSwap, mIsNil, mArrToSeq, mArray, mOpenArray, + mRange, mSet, mSeq, mInt, mInt8, mInt16, + mInt32, mInt64, mFloat, mFloat32, mFloat64, mBool, + mChar, mString, mCstring, mPointer, mAnyEnum, mEmptySet, + mIntSetBaseType, mNil, mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, + mNimrodMajor, mNimrodMinor, mNimrodPatch, mCpuEndian, mHostOS, mHostCPU, + mNaN, mInf, mNegInf, mNLen, mNChild, mNSetChild, + mNAdd, mNAddMultiple, mNDel, mNKind, mNIntVal, mNFloatVal, + mNSymbol, mNIdent, mNGetType, mNStrVal, mNSetIntVal, mNSetFloatVal, + mNSetSymbol, mNSetIdent, mNSetType, mNSetStrVal, mNNewNimNode, mNCopyNimNode, + mNCopyNimTree, mStrToIdent, mIdentToStr, mEqIdent, mNHint, mNWarning, + mNError //[[[end]]] ); @@ -322,7 +323,6 @@ type locProc, // location is a proc (an address of a procedure) locData, // location is a constant locCall, // location is a call expression - locImmediate, // location is an immediate value locOther // location is something other ); @@ -477,43 +477,44 @@ const // "MagicToStr" array: // if (i+1) % 6 == 0: cog.outl("") //cog.outl("'%s'" % magics[-1]) //]]] - 'None', 'Defined', 'Low', 'High', 'SizeOf', 'Is', - 'Succ', 'Pred', 'Inc', 'Dec', 'Ord', 'New', - 'NewFinalize', 'NewSeq', 'RegisterFinalizer', 'LengthOpenArray', 'LengthStr', 'LengthArray', - 'LengthSeq', 'Incl', 'Excl', 'Card', 'Chr', 'GCref', - 'GCunref', 'AddI', 'SubI', 'MulI', 'DivI', 'ModI', - 'AddI64', 'SubI64', 'MulI64', 'DivI64', 'ModI64', 'ShrI', - 'ShlI', 'BitandI', 'BitorI', 'BitxorI', 'MinI', 'MaxI', - 'ShrI64', 'ShlI64', 'BitandI64', 'BitorI64', 'BitxorI64', 'MinI64', - 'MaxI64', 'AddF64', 'SubF64', 'MulF64', 'DivF64', 'MinF64', - 'MaxF64', 'AddU', 'SubU', 'MulU', 'DivU', 'ModU', - 'AddU64', 'SubU64', 'MulU64', 'DivU64', 'ModU64', 'EqI', - 'LeI', 'LtI', 'EqI64', 'LeI64', 'LtI64', 'EqF64', - 'LeF64', 'LtF64', 'LeU', 'LtU', 'LeU64', 'LtU64', - 'EqEnum', 'LeEnum', 'LtEnum', 'EqCh', 'LeCh', 'LtCh', - 'EqB', 'LeB', 'LtB', 'EqRef', 'EqProc', 'EqUntracedRef', - 'LePtr', 'LtPtr', 'EqCString', 'Xor', 'UnaryMinusI', 'UnaryMinusI64', - 'AbsI', 'AbsI64', 'Not', 'UnaryPlusI', 'BitnotI', 'UnaryPlusI64', - 'BitnotI64', 'UnaryPlusF64', 'UnaryMinusF64', 'AbsF64', 'Ze8ToI', 'Ze8ToI64', - 'Ze16ToI', 'Ze16ToI64', 'Ze32ToI64', 'ZeIToI64', 'ToU8', 'ToU16', - 'ToU32', 'ToFloat', 'ToBiggestFloat', 'ToInt', 'ToBiggestInt', 'CharToStr', - 'BoolToStr', 'IntToStr', 'Int64ToStr', 'FloatToStr', 'CStrToStr', 'StrToStr', - 'And', 'Or', 'EqStr', 'LeStr', 'LtStr', 'EqSet', - 'LeSet', 'LtSet', 'MulSet', 'PlusSet', 'MinusSet', 'SymDiffSet', - 'ConStrStr', 'ConArrArr', 'ConArrT', 'ConTArr', 'ConTT', 'Slice', - 'AppendStrCh', 'AppendStrStr', 'AppendSeqElem', 'AppendSeqSeq', 'InRange', 'InSet', - 'Asgn', 'Repr', 'Exit', 'SetLengthStr', 'SetLengthSeq', 'Assert', - 'Swap', 'IsNil', 'ArrToSeq', 'Array', 'OpenArray', 'Range', - 'Set', 'Seq', 'Int', 'Int8', 'Int16', 'Int32', - 'Int64', 'Float', 'Float32', 'Float64', 'Bool', 'Char', - 'String', 'Cstring', 'Pointer', 'AnyEnum', 'EmptySet', 'IntSetBaseType', - 'Nil', 'IsMainModule', 'CompileDate', 'CompileTime', 'NimrodVersion', 'NimrodMajor', - 'NimrodMinor', 'NimrodPatch', 'CpuEndian', 'NaN', 'Inf', 'NegInf', - 'NLen', 'NChild', 'NSetChild', 'NAdd', 'NAddMultiple', 'NDel', - 'NKind', 'NIntVal', 'NFloatVal', 'NSymbol', 'NIdent', 'NGetType', - 'NStrVal', 'NSetIntVal', 'NSetFloatVal', 'NSetSymbol', 'NSetIdent', 'NSetType', - 'NSetStrVal', 'NNewNimNode', 'NCopyNimNode', 'NCopyNimTree', 'StrToIdent', 'IdentToStr', - 'EqIdent', 'NHint', 'NWarning', 'NError' + 'None', 'Defined', 'Low', 'High', 'SizeOf', 'Is', + 'Succ', 'Pred', 'Inc', 'Dec', 'Ord', 'New', + 'NewFinalize', 'NewSeq', 'RegisterFinalizer', 'LengthOpenArray', 'LengthStr', 'LengthArray', + 'LengthSeq', 'Incl', 'Excl', 'Card', 'Chr', 'GCref', + 'GCunref', 'AddI', 'SubI', 'MulI', 'DivI', 'ModI', + 'AddI64', 'SubI64', 'MulI64', 'DivI64', 'ModI64', 'ShrI', + 'ShlI', 'BitandI', 'BitorI', 'BitxorI', 'MinI', 'MaxI', + 'ShrI64', 'ShlI64', 'BitandI64', 'BitorI64', 'BitxorI64', 'MinI64', + 'MaxI64', 'AddF64', 'SubF64', 'MulF64', 'DivF64', 'MinF64', + 'MaxF64', 'AddU', 'SubU', 'MulU', 'DivU', 'ModU', + 'AddU64', 'SubU64', 'MulU64', 'DivU64', 'ModU64', 'EqI', + 'LeI', 'LtI', 'EqI64', 'LeI64', 'LtI64', 'EqF64', + 'LeF64', 'LtF64', 'LeU', 'LtU', 'LeU64', 'LtU64', + 'EqEnum', 'LeEnum', 'LtEnum', 'EqCh', 'LeCh', 'LtCh', + 'EqB', 'LeB', 'LtB', 'EqRef', 'EqProc', 'EqUntracedRef', + 'LePtr', 'LtPtr', 'EqCString', 'Xor', 'UnaryMinusI', 'UnaryMinusI64', + 'AbsI', 'AbsI64', 'Not', 'UnaryPlusI', 'BitnotI', 'UnaryPlusI64', + 'BitnotI64', 'UnaryPlusF64', 'UnaryMinusF64', 'AbsF64', 'Ze8ToI', 'Ze8ToI64', + 'Ze16ToI', 'Ze16ToI64', 'Ze32ToI64', 'ZeIToI64', 'ToU8', 'ToU16', + 'ToU32', 'ToFloat', 'ToBiggestFloat', 'ToInt', 'ToBiggestInt', 'CharToStr', + 'BoolToStr', 'IntToStr', 'Int64ToStr', 'FloatToStr', 'CStrToStr', 'StrToStr', + 'EnumToStr', 'And', 'Or', 'EqStr', 'LeStr', 'LtStr', + 'EqSet', 'LeSet', 'LtSet', 'MulSet', 'PlusSet', 'MinusSet', + 'SymDiffSet', 'ConStrStr', 'ConArrArr', 'ConArrT', 'ConTArr', 'ConTT', + 'Slice', 'AppendStrCh', 'AppendStrStr', 'AppendSeqElem', 'AppendSeqSeq', 'InRange', + 'InSet', 'Asgn', 'Repr', 'Exit', 'SetLengthStr', 'SetLengthSeq', + 'Assert', 'Swap', 'IsNil', 'ArrToSeq', 'Array', 'OpenArray', + 'Range', 'Set', 'Seq', 'Int', 'Int8', 'Int16', + 'Int32', 'Int64', 'Float', 'Float32', 'Float64', 'Bool', + 'Char', 'String', 'Cstring', 'Pointer', 'AnyEnum', 'EmptySet', + 'IntSetBaseType', 'Nil', 'IsMainModule', 'CompileDate', 'CompileTime', 'NimrodVersion', + 'NimrodMajor', 'NimrodMinor', 'NimrodPatch', 'CpuEndian', 'HostOS', 'HostCPU', + 'NaN', 'Inf', 'NegInf', 'NLen', 'NChild', 'NSetChild', + 'NAdd', 'NAddMultiple', 'NDel', 'NKind', 'NIntVal', 'NFloatVal', + 'NSymbol', 'NIdent', 'NGetType', 'NStrVal', 'NSetIntVal', 'NSetFloatVal', + 'NSetSymbol', 'NSetIdent', 'NSetType', 'NSetStrVal', 'NNewNimNode', 'NCopyNimNode', + 'NCopyNimTree', 'StrToIdent', 'IdentToStr', 'EqIdent', 'NHint', 'NWarning', + 'NError' //[[[end]]] ); @@ -1342,13 +1343,13 @@ end; function IntSetContains(const s: TIntSet; key: int): bool; var - u: int; + u: TBitScalar; t: PTrunk; begin - t := IntSetGet(s, key shr TrunkShift); + t := IntSetGet(s, shru(key, TrunkShift)); if t <> nil then begin u := key and TrunkMask; - result := (t.bits[u shr IntShift] and (1 shl (u and IntMask))) <> 0 + result := (t.bits[shru(u, IntShift)] and shlu(1, u and IntMask)) <> 0 end else result := false @@ -1356,27 +1357,27 @@ end; procedure IntSetIncl(var s: TIntSet; key: int); var - u: int; + u: TBitScalar; t: PTrunk; begin - t := IntSetPut(s, key shr TrunkShift); + t := IntSetPut(s, shru(key, TrunkShift)); u := key and TrunkMask; - t.bits[u shr IntShift] := t.bits[u shr IntShift] - or (1 shl (u and IntMask)); + t.bits[shru(u, IntShift)] := t.bits[shru(u, IntShift)] + or shlu(1, u and IntMask); end; function IntSetContainsOrIncl(var s: TIntSet; key: int): bool; var - u: int; + u: TBitScalar; t: PTrunk; begin - t := IntSetGet(s, key shr TrunkShift); + t := IntSetGet(s, shru(key, TrunkShift)); if t <> nil then begin u := key and TrunkMask; - result := (t.bits[u shr IntShift] and (1 shl (u and IntMask))) <> 0; + result := (t.bits[shru(u, IntShift)] and shlu(1, u and IntMask)) <> 0; if not result then - t.bits[u shr IntShift] := t.bits[u shr IntShift] - or (1 shl (u and IntMask)); + t.bits[shru(u, IntShift)] := t.bits[shru(u, IntShift)] + or shlu(1, u and IntMask); end else begin IntSetIncl(s, key); diff --git a/nim/astalgo.pas b/nim/astalgo.pas index 0e31f4ac7..f7b6f651d 100644 --- a/nim/astalgo.pas +++ b/nim/astalgo.pas @@ -450,29 +450,27 @@ begin else begin istr := spaces(indent+2); result := ropef('{$n$1"kind": $2', - [istr, makeYamlString(nodeKindToStr[n.kind])]); + [istr, makeYamlString(nodeKindToStr[n.kind])]); if maxRecDepth <> 0 then begin appf(result, ',$n$1"info": $2', [istr, lineInfoToStr(n.info)]); case n.kind of nkCharLit..nkInt64Lit: - appf(result, '$n$1"intVal": $2', [istr, toRope(n.intVal)]); + appf(result, ',$n$1"intVal": $2', [istr, toRope(n.intVal)]); nkFloatLit, nkFloat32Lit, nkFloat64Lit: - appf(result, '$n$1"floatVal": $2', - [istr, toRopeF(n.floatVal)]); + appf(result, ',$n$1"floatVal": $2', [istr, toRopeF(n.floatVal)]); nkStrLit..nkTripleStrLit: - appf(result, '$n$1"strVal": $2', - [istr, makeYamlString(n.strVal)]); + appf(result, ',$n$1"strVal": $2', [istr, makeYamlString(n.strVal)]); nkSym: appf(result, ',$n$1"sym": $2', [istr, symToYamlAux(n.sym, marker, indent+2, maxRecDepth)]); nkIdent: begin if n.ident <> nil then - appf(result, '$n$1"ident": $2', + appf(result, ',$n$1"ident": $2', [istr, makeYamlString(n.ident.s)]) else - appf(result, '$n$1"ident": null', [istr]) + appf(result, ',$n$1"ident": null', [istr]) end else begin if sonsLen(n) > 0 then begin @@ -552,12 +550,12 @@ begin if maxRecDepth <> 0 then begin case n.kind of nkCharLit..nkInt64Lit: - appf(result, '$n$1"intVal": $2', [istr, toRope(n.intVal)]); + appf(result, ',$n$1"intVal": $2', [istr, toRope(n.intVal)]); nkFloatLit, nkFloat32Lit, nkFloat64Lit: - appf(result, '$n$1"floatVal": $2', + appf(result, ',$n$1"floatVal": $2', [istr, toRopeF(n.floatVal)]); nkStrLit..nkTripleStrLit: - appf(result, '$n$1"strVal": $2', + appf(result, ',$n$1"strVal": $2', [istr, makeYamlString(n.strVal)]); nkSym: appf(result, ',$n$1"sym": $2_$3', @@ -565,10 +563,10 @@ begin nkIdent: begin if n.ident <> nil then - appf(result, '$n$1"ident": $2', + appf(result, ',$n$1"ident": $2', [istr, makeYamlString(n.ident.s)]) else - appf(result, '$n$1"ident": null', [istr]) + appf(result, ',$n$1"ident": null', [istr]) end else begin if sonsLen(n) > 0 then begin diff --git a/nim/ccgexprs.pas b/nim/ccgexprs.pas index f94cff3a4..161804208 100644 --- a/nim/ccgexprs.pas +++ b/nim/ccgexprs.pas @@ -126,7 +126,7 @@ var j: int; begin result := 0; - if CPU[hostCPU].endian = CPU[targetCPU].endian then begin + if CPU[platform.hostCPU].endian = CPU[targetCPU].endian then begin for j := 0 to size-1 do if j < length(s) then result := result or shlu(Ze64(s[j]), j * 8) @@ -773,6 +773,34 @@ begin putIntoDest(p, d, field.typ, r); end; +procedure genTupleElem(p: BProc; e: PNode; var d: TLoc); +var + a: TLoc; + field: PSym; + ty: PType; + r: PRope; + i: int; +begin + initLocExpr(p, e.sons[0], a); + if d.k = locNone then d.s := a.s; + {@discard} getTypeDesc(p.module, a.t); // fill the record's fields.loc + ty := getUniqueType(a.t); + r := rdLoc(a); + case e.sons[1].kind of + nkIntLit..nkInt64Lit: i := int(e.sons[1].intVal); + else internalError(e.info, 'genTupleElem'); + end; + if ty.n <> nil then begin + field := ty.n.sons[i].sym; + if field = nil then InternalError(e.info, 'genTupleElem'); + if field.loc.r = nil then InternalError(e.info, 'genTupleElem'); + appf(r, '.$1', [field.loc.r]); + end + else + appf(r, '.Field$1', [toRope(i)]); + putIntoDest(p, d, ty.sons[i], r); +end; + procedure genInExprAux(p: BProc; e: PNode; var a, b, d: TLoc); forward; procedure genCheckedRecordField(p: BProc; e: PNode; var d: TLoc); @@ -848,10 +876,11 @@ begin first := intLiteral(firstOrd(ty)); // emit range check: if (optBoundsCheck in p.options) then begin - if b.k <> locImmediate then begin // semantic pass has already checked: + if not isConstExpr(e.sons[1]) then begin + // semantic pass has already checked for const index expressions useMagic(p.module, 'raiseIndexError'); if firstOrd(ty) = 0 then begin - if lastOrd(b.t) > lastOrd(ty) then + if (firstOrd(b.t) < firstOrd(ty)) or (lastOrd(b.t) > lastOrd(ty)) then appf(p.s[cpsStmts], 'if ((NU)($1) > (NU)($2)) raiseIndexError();$n', [rdCharLoc(b), intLiteral(lastOrd(ty))]) @@ -1289,14 +1318,22 @@ var a, b, f: TLoc; refType, bt: PType; ti: PRope; + oldModule: BModule; begin useMagic(p.module, 'newObj'); refType := skipVarGenericRange(e.sons[1].typ); InitLocExpr(p, e.sons[1], a); + + // This is a little hack: + oldModule := p.module; + p.module := gmti; InitLocExpr(p, e.sons[2], f); + p.module := oldModule; + initLoc(b, locExpr, a.t, OnHeap); ti := genTypeInfo(p.module, refType); - appf(p.module.s[cfsTypeInit3], '$1->finalizer = (void*)$2;$n', [ + + appf(gmti.s[cfsTypeInit3], '$1->finalizer = (void*)$2;$n', [ ti, rdLoc(f)]); b.r := ropef('($1) newObj($2, sizeof($3))', [getTypeDesc(p.module, refType), ti, @@ -1331,7 +1368,7 @@ begin UseMagic(p.module, 'reprChar'); putIntoDest(p, d, e.typ, ropef('reprChar($1)', [rdLoc(a)])) end; - tyEnum: begin + tyEnum, tyAnyEnum: begin UseMagic(p.module, 'reprEnum'); putIntoDest(p, d, e.typ, ropef('reprEnum($1, $2)', [rdLoc(a), genTypeInfo(p.module, t)])) @@ -1853,6 +1890,7 @@ begin mFloatToStr: genDollar(p, e, d, 'nimFloatToStr', 'nimFloatToStr($1)'); mCStrToStr: genDollar(p, e, d, 'cstrToNimstr', 'cstrToNimstr($1)'); mStrToStr: expr(p, e.sons[1], d); + mEnumToStr: genRepr(p, e, d); mAssert: begin if (optAssert in p.Options) then begin useMagic(p.module, 'internalAssert'); @@ -1996,23 +2034,31 @@ var it: PNode; t: PType; begin - // the code generator assumes that there are only tuple constructors with - // field names! if not handleConstExpr(p, n, d) then begin t := getUniqueType(n.typ); {@discard} getTypeDesc(p.module, t); // so that any fields are initialized if d.k = locNone then getTemp(p, t, d); - if t.n = nil then InternalError(n.info, 'genTupleConstr'); - if sonsLen(t.n) <> sonsLen(n) then - InternalError(n.info, 'genTupleConstr'); for i := 0 to sonsLen(n)-1 do begin it := n.sons[i]; - if it.kind <> nkExprColonExpr then InternalError(n.info, 'genTupleConstr'); - initLoc(rec, locExpr, it.sons[1].typ, d.s); - if (t.n.sons[i].kind <> nkSym) then - InternalError(n.info, 'genTupleConstr'); - rec.r := ropef('$1.$2', [rdLoc(d), mangleRecFieldName(t.n.sons[i].sym, t)]); - expr(p, it.sons[1], rec); + if it.kind = nkExprColonExpr then begin + initLoc(rec, locExpr, it.sons[1].typ, d.s); + if (t.n.sons[i].kind <> nkSym) then + InternalError(n.info, 'genTupleConstr'); + rec.r := ropef('$1.$2', [rdLoc(d), mangleRecFieldName(t.n.sons[i].sym, t)]); + expr(p, it.sons[1], rec); + end + else if t.n = nil then begin + initLoc(rec, locExpr, it.typ, d.s); + rec.r := ropef('$1.Field$2', [rdLoc(d), toRope(i)]); + expr(p, it, rec); + end + else begin + initLoc(rec, locExpr, it.typ, d.s); + if (t.n.sons[i].kind <> nkSym) then + InternalError(n.info, 'genTupleConstr: 2'); + rec.r := ropef('$1.$2', [rdLoc(d), mangleRecFieldName(t.n.sons[i].sym, t)]); + expr(p, it, rec); + end end end end; @@ -2123,11 +2169,10 @@ begin sym := e.sym; case sym.Kind of skProc, skConverter: begin - // generate prototype if not already declared in this translation unit - genProcPrototype(p.module, sym); + genProc(p.module, sym); if ((sym.loc.r = nil) or (sym.loc.t = nil)) then InternalError(e.info, 'expr: proc not init ' + sym.name.s); - putLocIntoDest(p, d, sym.loc) + putLocIntoDest(p, d, sym.loc); end; skConst: if isSimpleConst(sym.typ) then @@ -2160,8 +2205,6 @@ begin nkStrLit..nkTripleStrLit, nkIntLit..nkInt64Lit, nkFloatLit..nkFloat64Lit, nkNilLit, nkCharLit: begin putIntoDest(p, d, e.typ, genLiteral(p, e)); - if d.k in [locNone, locExpr] then - d.k := locImmediate // for removal of index checks end; nkCall, nkHiddenCallConv, nkInfix, nkPrefix, nkPostfix, nkCommand: begin if (e.sons[0].kind = nkSym) and @@ -2189,6 +2232,7 @@ begin tyOpenArray: genOpenArrayElem(p, e, d); tySequence, tyString: genSeqElem(p, e, d); tyCString: genCStringElem(p, e, d); + tyTuple: genTupleElem(p, e, d); else InternalError(e.info, 'expr(nkBracketExpr, ' + typeKindToStr[ty.kind] + ')'); end diff --git a/nim/ccgstmts.pas b/nim/ccgstmts.pas index 0e93d6b0f..e611bbeea 100644 --- a/nim/ccgstmts.pas +++ b/nim/ccgstmts.pas @@ -801,9 +801,16 @@ begin assert(key.kind = nkIdent); case whichKeyword(key.ident) of wBreakpoint: genBreakPoint(p, it); + wDeadCodeElim: begin + if not (optDeadCodeElim in gGlobalOptions) then begin + // we need to keep track of ``deadCodeElim`` pragma + if (sfDeadCodeElim in p.module.module.flags) then + addPendingModule(p.module) + end + end else begin end end - end + end; end; procedure genAsgn(p: BProc; e: PNode); @@ -816,6 +823,17 @@ begin expr(p, e.sons[1], a); end; +procedure genFastAsgn(p: BProc; e: PNode); +var + a: TLoc; +begin + genLineDir(p, e); // BUGFIX + InitLocExpr(p, e.sons[0], a); + include(a.flags, lfNoDeepCopy); + assert(a.t <> nil); + expr(p, e.sons[1], a); +end; + procedure genStmts(p: BProc; t: PNode); var a: TLoc; @@ -844,6 +862,7 @@ begin initLocExpr(p, t, a); end; nkAsgn: genAsgn(p, t); + nkFastAsgn: genFastAsgn(p, t); nkDiscardStmt: begin genLineDir(p, t); initLocExpr(p, t.sons[0], a); @@ -865,17 +884,13 @@ begin nkProcDef, nkConverterDef: begin if (t.sons[genericParamsPos] = nil) then begin prc := t.sons[namePos].sym; - if (t.sons[codePos] <> nil) - or (lfDynamicLib in prc.loc.flags) then begin // BUGFIX - if IntSetContainsOrIncl(p.module.debugDeclared, prc.id) then begin - internalError(t.info, 'genStmts(): ' + toString(prc.id)); - // XXX: remove this check! - end; - //if IntSetContains(p.module.debugDeclared, 2642) then - // InternalError(t.info, 'this sucks ' + toString(prc.id)); - genProc(p.module, prc) + if not (optDeadCodeElim in gGlobalOptions) and + not (sfDeadCodeElim in getModule(prc).flags) + or ([sfExportc, sfCompilerProc] * prc.flags = [sfExportc]) then begin + if (t.sons[codePos] <> nil) or (lfDynamicLib in prc.loc.flags) then begin + genProc(p.module, prc) + end end - //else if sfCompilerProc in prc.flags then genProcPrototype(prc); end end; else diff --git a/nim/ccgtypes.pas b/nim/ccgtypes.pas index 5f4def667..f6eb64c08 100644 --- a/nim/ccgtypes.pas +++ b/nim/ccgtypes.pas @@ -8,7 +8,7 @@ // //var -// newDummyVar: int; // just to check the rodgen mechanism +// newDummyVar: int; // just to check the symbol file mechanism // ------------------------- Name Mangling -------------------------------- @@ -461,6 +461,22 @@ begin app(result, '};' + tnl); end; +function getTupleDesc(m: BModule; typ: PType; name: PRope; + var check: TIntSet): PRope; +var + desc: PRope; + i: int; +begin + result := ropef('struct $1 {$n', [name]); + desc := nil; + for i := 0 to sonsLen(typ)-1 do + appf(desc, '$1 Field$2;$n', + [getTypeDescAux(m, typ.sons[i], check), toRope(i)]); + if (desc = nil) then app(result, 'char dummy;' + tnl) + else app(result, desc); + app(result, '};' + tnl); +end; + procedure pushType(m: BModule; typ: PType); var L: int; @@ -571,13 +587,15 @@ begin if result = nil then begin result := getTypeName(t); if not isImportedType(t) then - appf(m.s[cfsForwardTypes], - getForwardStructFormat(), [result]); + appf(m.s[cfsForwardTypes], getForwardStructFormat(), [result]); IdTablePut(m.forwTypeCache, t, result) end; IdTablePut(m.typeCache, t, result); // always call for sideeffects: - recdesc := getRecordDesc(m, t, result, check); + if t.n <> nil then + recdesc := getRecordDesc(m, t, result, check) + else + recdesc := getTupleDesc(m, t, result, check); if not isImportedType(t) then app(m.s[cfsTypes], recdesc); end; tySet: begin @@ -735,9 +753,11 @@ begin assert(n.sons[0].kind = nkSym); field := n.sons[0].sym; tmp := getTempName(); + useMagic(m, 'chckNil'); appf(m.s[cfsTypeInit3], '$1.kind = 3;$n' + '$1.offset = offsetof($2, $3);$n' + '$1.typ = $4;$n' + + 'chckNil($1.typ);$n' + '$1.name = $5;$n' + '$1.sons = &$6[0];$n' + '$1.len = $7;$n', @@ -746,7 +766,7 @@ begin makeCString(field.name.s), tmp, toRope(lengthOrd(field.typ))]); appf(m.s[cfsTypeInit1], 'static TNimNode* $1[$2];$n', - [tmp, toRope(lengthOrd(field.typ)+1)]); + [tmp, toRope(lengthOrd(field.typ)+1)]); for i := 1 to len-1 do begin b := n.sons[i]; // branch tmp2 := getNimNode(m); @@ -761,18 +781,18 @@ begin y := int(getOrdValue(b.sons[j].sons[1])); while x <= y do begin appf(m.s[cfsTypeInit3], '$1[$2] = &$3;$n', - [tmp, toRope(x), tmp2]); + [tmp, toRope(x), tmp2]); inc(x); end; end else appf(m.s[cfsTypeInit3], '$1[$2] = &$3;$n', - [tmp, toRope(getOrdValue(b.sons[j])), tmp2]) + [tmp, toRope(getOrdValue(b.sons[j])), tmp2]) end end; nkElse: begin appf(m.s[cfsTypeInit3], '$1[$2] = &$3;$n', - [tmp, toRope(lengthOrd(field.typ)), tmp2]); + [tmp, toRope(lengthOrd(field.typ)), tmp2]); end else internalError(n.info, 'genObjectFields(nkRecCase)'); @@ -781,9 +801,11 @@ begin end; nkSym: begin field := n.sym; + useMagic(m, 'chckNil'); appf(m.s[cfsTypeInit3], '$1.kind = 1;$n' + '$1.offset = offsetof($2, $3);$n' + '$1.typ = $4;$n' + + 'chckNil($1.typ);$n' + '$1.name = $5;$n', [expr, getTypeDesc(m, typ), field.loc.r, genTypeInfo(m, field.typ), @@ -804,6 +826,41 @@ begin appf(m.s[cfsTypeInit3], '$1->node = &$2;$n', [name, tmp]); end; +procedure genTupleInfo(m: BModule; typ: PType; name: PRope); +var + tmp, expr, tmp2: PRope; + i, len: int; + a: PType; +begin + genTypeInfoAuxBase(m, typ, name, toRope('0'+'')); + expr := getNimNode(m); + len := sonsLen(typ); + if len > 0 then begin + tmp := getTempName(); + appf(m.s[cfsTypeInit1], 'static TNimNode* $1[$2];$n', [tmp, toRope(len)]); + for i := 0 to len-1 do begin + a := typ.sons[i]; + tmp2 := getNimNode(m); + appf(m.s[cfsTypeInit3], '$1[$2] = &$3;$n', [tmp, toRope(i), tmp2]); + useMagic(m, 'chckNil'); + appf(m.s[cfsTypeInit3], '$1.kind = 1;$n' + + '$1.offset = offsetof($2, Field$3);$n' + + '$1.typ = $4;$n' + + 'chckNil($1.typ);$n' + + '$1.name = "Field$3";$n', + [tmp2, getTypeDesc(m, typ), toRope(i), + genTypeInfo(m, a)]); + end; + appf(m.s[cfsTypeInit3], + '$1.len = $2; $1.kind = 2; $1.sons = &$3[0];$n', [ + expr, toRope(len), tmp]); + end + else + appf(m.s[cfsTypeInit3], + '$1.len = $2; $1.kind = 2;$n', [expr, toRope(len)]); + appf(m.s[cfsTypeInit3], '$1->node = &$2;$n', [name, tmp]); +end; + procedure genEnumInfo(m: BModule; typ: PType; name: PRope); var nodePtrs, elemNode, enumNames, enumArray, counter, specialCases: PRope; @@ -817,7 +874,8 @@ begin genTypeInfoAux(m, typ, name); nodePtrs := getTempName(); len := sonsLen(typ.n); - appf(m.s[cfsTypeInit1], 'static TNimNode* $1[$2];$n', [nodePtrs, toRope(len)]); + appf(m.s[cfsTypeInit1], 'static TNimNode* $1[$2];$n', + [nodePtrs, toRope(len)]); enumNames := nil; specialCases := nil; firstNimNode := m.typeNodes; @@ -879,83 +937,79 @@ function genTypeInfo(m: BModule; typ: PType): PRope; var t: PType; id: int; - dataGen: bool; + dataGenerated: bool; begin t := getUniqueType(typ); id := IiTableGet(gToTypeInfoId, t.id); if id = invalidKey then begin - dataGen := false; - case t.kind of - tyEnum, tyBool: begin - id := t.id; - dataGen := true - end; - tyObject: begin - if isPureObject(t) then - id := getID() - else begin - id := t.id; - dataGen := true - end - end - else - id := getID(); - end; + dataGenerated := false; + id := t.id; // getID(); IiTablePut(gToTypeInfoId, t.id, id); end else - dataGen := true; + dataGenerated := true; result := ropef('NTI$1', [toRope(id)]); - if not IntSetContainsOrIncl(m.typeInfoMarker, t.id) then begin + if not IntSetContainsOrIncl(m.typeInfoMarker, id) then begin // declare type information structures: useMagic(m, 'TNimType'); useMagic(m, 'TNimNode'); - if dataGen then - appf(m.s[cfsVars], 'extern TNimType* $1; /* $2 */$n', - [result, toRope(typeToString(t))]); + appf(m.s[cfsVars], 'extern TNimType* $1; /* $2 */$n', + [result, toRope(typeToString(t))]); end; - if dataGen then exit; + if dataGenerated then exit; case t.kind of tyPointer, tyProc, tyBool, tyChar, tyCString, tyString, tyInt..tyFloat128, tyVar: - genTypeInfoAuxBase(m, t, result, toRope('0'+'')); - tyRef, tyPtr, tySequence, tyRange: genTypeInfoAux(m, t, result); - tyArrayConstr, tyArray: genArrayInfo(m, t, result); - tySet: genSetInfo(m, t, result); - tyEnum: genEnumInfo(m, t, result); - tyObject, tyTuple: genObjectInfo(m, t, result); + genTypeInfoAuxBase(gmti, t, result, toRope('0'+'')); + tyRef, tyPtr, tySequence, tyRange: genTypeInfoAux(gmti, t, result); + tyArrayConstr, tyArray: genArrayInfo(gmti, t, result); + tySet: genSetInfo(gmti, t, result); + tyEnum: genEnumInfo(gmti, t, result); + tyObject: genObjectInfo(gmti, t, result); + tyTuple: begin + if t.n <> nil then genObjectInfo(gmti, t, result) + else genTupleInfo(gmti, t, result); + end; else InternalError('genTypeInfo(' + typekindToStr[t.kind] + ')'); end end; +procedure genTypeSection(m: BModule; n: PNode); +begin +end; + +(* procedure genTypeSection(m: BModule; n: PNode); var i: int; a: PNode; t: PType; begin - for i := 0 to sonsLen(n)-1 do begin - a := n.sons[i]; - if a.kind = nkCommentStmt then continue; - if (a.sons[0].kind <> nkSym) then InternalError(a.info, 'genTypeSection'); - t := a.sons[0].sym.typ; - if (a.sons[2] = nil) - or not (a.sons[2].kind in [nkSym, nkIdent, nkAccQuoted]) then - if t <> nil then - case t.kind of - tyEnum, tyBool: begin - useMagic(m, 'TNimType'); - useMagic(m, 'TNimNode'); - genEnumInfo(m, t, ropef('NTI$1', [toRope(t.id)])); - end; - tyObject: begin - if not isPureObject(t) then begin + if not (optDeadCodeElim in gGlobalOptions) then begin + for i := 0 to sonsLen(n)-1 do begin + a := n.sons[i]; + if a.kind = nkCommentStmt then continue; + if (a.sons[0].kind <> nkSym) then InternalError(a.info, 'genTypeSection'); + t := a.sons[0].sym.typ; + if (a.sons[2] = nil) + or not (a.sons[2].kind in [nkSym, nkIdent, nkAccQuoted]) then + if t <> nil then + case t.kind of + tyEnum, tyBool: begin useMagic(m, 'TNimType'); useMagic(m, 'TNimNode'); - genObjectInfo(m, t, ropef('NTI$1', [toRope(t.id)])); + genEnumInfo(m, t, ropef('NTI$1', [toRope(t.id)])); + end; + tyObject: begin + if not isPureObject(t) then begin + useMagic(m, 'TNimType'); + useMagic(m, 'TNimNode'); + genObjectInfo(m, t, ropef('NTI$1', [toRope(t.id)])); + end end + else begin end end - else begin end - end + end end end; +*) \ No newline at end of file diff --git a/nim/ccgutils.pas b/nim/ccgutils.pas index 05f2ea828..97ef65f70 100644 --- a/nim/ccgutils.pas +++ b/nim/ccgutils.pas @@ -27,16 +27,48 @@ function GetUniqueType(key: PType): PType; implementation var - gTypeTable: TIdTable; + gTypeTable: array [TTypeKind] of TIdTable; + +procedure initTypeTables(); +var + i: TTypeKind; +begin + for i := low(TTypeKind) to high(TTypeKind) do + InitIdTable(gTypeTable[i]); +end; function GetUniqueType(key: PType): PType; var t: PType; h: THash; + k: TTypeKind; begin - // this was a hotspot in the compiler! + // this is a hotspot in the compiler! result := key; if key = nil then exit; + k := key.kind; + case k of + tyObject, tyEnum: begin + result := PType(IdTableGet(gTypeTable[k], key)); + if result = nil then begin + IdTablePut(gTypeTable[k], key, key); + result := key; + end + end; + tyGenericInst: result := GetUniqueType(lastSon(key)); + tyProc: begin end; + else begin + // we have to do a slow linear search because types may need + // to be compared by their structure: + if IdTableHasObjectAsKey(gTypeTable[k], key) then exit; + for h := 0 to high(gTypeTable[k].data) do begin + t := PType(gTypeTable[k].data[h].key); + if (t <> nil) and sameType(t, key) then begin result := t; exit end + end; + IdTablePut(gTypeTable[k], key, key); + end; + end; + (* case key.Kind of tyEmpty, tyChar, tyBool, tyNil, tyPointer, tyString, tyCString, tyInt..tyFloat128, tyProc, tyAnyEnum: begin end; @@ -62,7 +94,7 @@ begin end end; tyGenericInst: result := GetUniqueType(lastSon(key)); - end; + end; *) end; function TableGetType(const tab: TIdTable; key: PType): PObject; @@ -122,6 +154,6 @@ begin app(result, toRope(res)); end; -initialization - InitIdTable(gTypeTable); +begin + InitTypeTables(); end. diff --git a/nim/cgen.pas b/nim/cgen.pas index 736d4b796..02713f902 100644 --- a/nim/cgen.pas +++ b/nim/cgen.pas @@ -73,7 +73,6 @@ type cpsStmts // section of local statements for C proc ); - TCProcSections = array [TCProcSection] of PRope; // TCProcSections represents a generated C proc @@ -112,21 +111,64 @@ type typeCache: TIdTable; // cache the generated types forwTypeCache: TIdTable; // cache for forward declarations of types declaredThings: TIntSet; // things we have declared in this .c file - debugDeclared: TIntSet; // for debugging purposes + declaredProtos: TIntSet; // prototypes we have declared in this .c file headerFiles: TLinkedList; // needed headers to include typeInfoMarker: TIntSet; // needed for generating type information initProc: BProc; // code for init procedure typeStack: TTypeSeq; // used for type generation dataCache: TNodeTable; + forwardedProcs: TSymSeq; // keep forwarded procs here typeNodes, nimTypes: int;// used for type info generation - typeNodesName, nimTypesName: PRope; // used for type info generation + typeNodesName, nimTypesName: PRope; // used for type info generation end; var mainModProcs, mainModInit: PRope; // parts of the main module gMapping: PRope; // the generated mapping file (if requested) gProcProfile: Natural; // proc profile counter + gGeneratedSyms: TIntSet; // set of ID's of generated symbols + gPendingModules: array of BModule = {@ignore} nil {@emit @[]}; + // list of modules that are not finished with code generation + gForwardedProcsCounter: int = 0; + gmti: BModule; // generated type info: no need to initialize: defaults fit +procedure addForwardedProc(m: BModule; prc: PSym); +var + L: int; +begin + L := length(m.forwardedProcs); + setLength(m.forwardedProcs, L+1); + m.forwardedProcs[L] := prc; + inc(gForwardedProcsCounter); +end; + +procedure addPendingModule(m: BModule); +var + L, i: int; +begin + for i := 0 to high(gPendingModules) do + if gPendingModules[i] = m then + InternalError('module already pending: ' + m.module.name.s); + L := length(gPendingModules); + setLength(gPendingModules, L+1); + gPendingModules[L] := m; +end; + +function findPendingModule(m: BModule; s: PSym): BModule; +var + ms: PSym; + i: int; +begin + ms := getModule(s); + if ms.id = m.module.id then begin + result := m; exit + end; + for i := 0 to high(gPendingModules) do begin + result := gPendingModules[i]; + if result.module.id = ms.id then exit; + end; + InternalError(s.info, 'no pending module found for: ' + s.name.s); +end; procedure initLoc(var result: TLoc; k: TLocKind; typ: PType; s: TStorageLoc); begin @@ -209,26 +251,13 @@ end; // -------------------------- Variable manager ---------------------------- -procedure declareGlobalVar(m: BModule; s: PSym); -begin - if not IntSetContainsOrIncl(m.declaredThings, s.id) then begin - app(m.s[cfsVars], getTypeDesc(m, s.loc.t)); - if sfRegister in s.flags then - app(m.s[cfsVars], ' register'); - if sfVolatile in s.flags then - app(m.s[cfsVars], ' volatile'); - if sfThreadVar in s.flags then - app(m.s[cfsVars], ' NIM_THREADVAR'); - appf(m.s[cfsVars], ' $1;$n', [s.loc.r]) - end -end; - procedure assignLocalVar(p: BProc; s: PSym); begin //assert(s.loc.k == locNone) // not yet assigned // this need not be fullfilled for inline procs; they are regenerated // for each module that uses them! - fillLoc(s.loc, locLocalVar, s.typ, mangleName(s), OnStack); + if s.loc.k = locNone then + fillLoc(s.loc, locLocalVar, s.typ, mangleName(s), OnStack); app(p.s[cpsLocals], getTypeDesc(p.module, s.loc.t)); if sfRegister in s.flags then app(p.s[cpsLocals], ' register'); @@ -248,11 +277,19 @@ end; procedure assignGlobalVar(m: BModule; s: PSym); begin - fillLoc(s.loc, locGlobalVar, s.typ, mangleName(s), OnHeap); + if s.loc.k = locNone then + fillLoc(s.loc, locGlobalVar, s.typ, mangleName(s), OnHeap); useHeader(m, s); if lfNoDecl in s.loc.flags then exit; if sfImportc in s.flags then app(m.s[cfsVars], 'extern '); - declareGlobalVar(m, s); + app(m.s[cfsVars], getTypeDesc(m, s.loc.t)); + if sfRegister in s.flags then + app(m.s[cfsVars], ' register'); + if sfVolatile in s.flags then + app(m.s[cfsVars], ' volatile'); + if sfThreadVar in s.flags then + app(m.s[cfsVars], ' NIM_THREADVAR'); + appf(m.s[cfsVars], ' $1;$n', [s.loc.r]); if [optStackTrace, optEndb] * m.module.options = [optStackTrace, optEndb] then begin useMagic(m, 'dbgRegisterGlobal'); @@ -282,6 +319,12 @@ begin end end; +procedure fillProcLoc(sym: PSym); +begin + if sym.loc.k = locNone then + fillLoc(sym.loc, locProc, sym.typ, mangleName(sym), OnStack); +end; + // -------------------------- label manager ------------------------------- // note that a label is a location too @@ -296,11 +339,11 @@ begin appf(p.s[cpsStmts], '$1: ;$n', [labl]) end; -procedure genProcPrototype(m: BModule; sym: PSym); forward; procedure genVarPrototype(m: BModule; sym: PSym); forward; procedure genConstPrototype(m: BModule; sym: PSym); forward; procedure genProc(m: BModule; prc: PSym); forward; procedure genStmts(p: BProc; t: PNode); forward; +procedure genProcPrototype(m: BModule; sym: PSym); forward; {$include 'ccgexprs.pas'} {$include 'ccgstmts.pas'} @@ -343,11 +386,11 @@ begin tmp := ropef('Dl_$1', [toRope(sym.id)]); sym.loc.r := tmp; // from now on we only need the internal name sym.typ.sym := nil; // generate a new name - appf(m.s[cfsDynLibInit], - '$1 = ($2) nimGetProcAddr($3, $4);$n', - [tmp, getTypeDesc(m, sym.typ), lib.name, - makeCString(ropeToStr(extname))]); - declareGlobalVar(m, sym) + appf(m.s[cfsDynLibInit], '$1 = ($2) nimGetProcAddr($3, $4);$n', + [tmp, getTypeDesc(m, sym.typ), lib.name, makeCString(ropeToStr(extname))]); + + app(m.s[cfsVars], getTypeDesc(m, sym.loc.t)); + appf(m.s[cfsVars], ' $1;$n', [sym.loc.r]); end; // ----------------------------- sections --------------------------------- @@ -356,16 +399,16 @@ procedure UseMagic(m: BModule; const name: string); var sym: PSym; begin - if (sfSystemModule in m.module.flags) then exit; - // we don't know the magic symbols in the system module, but they will be - // there anyway, because that is the way the code generator works sym := magicsys.getCompilerProc(name); - case sym.kind of - skProc, skConverter: genProcPrototype(m, sym); - skVar: genVarPrototype(m, sym); - skType: {@discard} getTypeDesc(m, sym.typ); - else InternalError('useMagic: ' + name) - end + if sym <> nil then + case sym.kind of + skProc, skConverter: genProc(m, sym); + skVar: genVarPrototype(m, sym); + skType: {@discard} getTypeDesc(m, sym.typ); + else InternalError('useMagic: ' + name) + end + else if not (sfSystemModule in m.module.flags) then + rawMessage(errSystemNeeds, name); // don't be too picky here end; procedure generateHeaders(m: BModule); @@ -405,95 +448,131 @@ begin result := (s.typ.sons[0] <> nil) and not isInvalidReturnType(s.typ.sons[0]) end; -procedure genProc(m: BModule; prc: PSym); +procedure genProcAux(m: BModule; prc: PSym); var p: BProc; generatedProc, header, returnStmt: PRope; - i, profileId: int; + i: int; res, param: PSym; begin - useHeader(m, prc); - fillLoc(prc.loc, locProc, prc.typ, mangleName(prc), OnStack); - if (lfNoDecl in prc.loc.Flags) then exit; - if lfDynamicLib in prc.loc.flags then - SymInDynamicLib(m, prc) - else if not (sfImportc in prc.flags) then begin - // we have a real proc here: - p := newProc(prc, m); - header := genProcHeader(m, prc); - if (sfCompilerProc in prc.flags) - and (sfSystemModule in m.module.flags) - and not IntSetContains(m.declaredThings, prc.id) then - appf(m.s[cfsProcHeaders], '$1;$n', [header]); - intSetIncl(m.declaredThings, prc.id); - returnStmt := nil; - assert(prc.ast <> nil); + p := newProc(prc, m); + header := genProcHeader(m, prc); + returnStmt := nil; + assert(prc.ast <> nil); - if not (sfPure in prc.flags) and (prc.typ.sons[0] <> nil) then begin - res := prc.ast.sons[resultPos].sym; // get result symbol - if not isInvalidReturnType(prc.typ.sons[0]) then begin - // declare the result symbol: - assignLocalVar(p, res); - assert(res.loc.r <> nil); - returnStmt := ropef('return $1;$n', [rdLoc(res.loc)]); - end - else begin - fillResult(res); - assignParam(p, res); - end; - initVariable(p, res); - genObjectInit(p, res.typ, res.loc, true); - end; - for i := 1 to sonsLen(prc.typ.n)-1 do begin - param := prc.typ.n.sons[i].sym; - assignParam(p, param) - end; - - genStmts(p, prc.ast.sons[codePos]); // modifies p.locals, p.init, etc. - if sfPure in prc.flags then - generatedProc := ropef('$1 {$n$2$3$4}$n', - [header, p.s[cpsLocals], p.s[cpsInit], p.s[cpsStmts]]) + if not (sfPure in prc.flags) and (prc.typ.sons[0] <> nil) then begin + res := prc.ast.sons[resultPos].sym; // get result symbol + if not isInvalidReturnType(prc.typ.sons[0]) then begin + // declare the result symbol: + assignLocalVar(p, res); + assert(res.loc.r <> nil); + returnStmt := ropef('return $1;$n', [rdLoc(res.loc)]); + end else begin - generatedProc := con(header, '{' + tnl); - if optStackTrace in prc.options then begin - getFrameDecl(p); - prepend(p.s[cpsInit], ropef( - 'F.procname = $1;$n' + - 'F.prev = framePtr;$n' + - 'F.filename = $2;$n' + - 'F.line = 0;$n' + - 'framePtr = (TFrame*)&F;$n', - [makeCString(prc.owner.name.s +{&} '.' +{&} prc.name.s), - makeCString(toFilename(prc.info))])); - end; - if optProfiler in prc.options then begin - if gProcProfile >= 64*1024 then // XXX: hard coded value! - InternalError(prc.info, 'too many procedures for profiling'); - useMagic(m, 'profileData'); - app(p.s[cpsLocals], 'ticks NIM_profilingStart;'+tnl); - if prc.loc.a < 0 then begin - appf(m.s[cfsDebugInit], 'profileData[$1].procname = $2;$n', - [toRope(gProcProfile), - makeCString(prc.owner.name.s +{&} '.' +{&} prc.name.s)]); - prc.loc.a := gProcProfile; - inc(gProcProfile); - end; - prepend(p.s[cpsInit], toRope('NIM_profilingStart = getticks();' + tnl)); - end; - app(generatedProc, con(p.s)); - if p.beforeRetNeeded then - app(generatedProc, 'BeforeRet: ;' + tnl); - if optStackTrace in prc.options then - app(generatedProc, 'framePtr = framePtr->prev;' + tnl); - if optProfiler in prc.options then - appf(generatedProc, - 'profileData[$1].total += elapsed(getticks(), NIM_profilingStart);$n', - [toRope(prc.loc.a)]); - app(generatedProc, returnStmt); - app(generatedProc, '}' + tnl); + fillResult(res); + assignParam(p, res); end; - app(m.s[cfsProcs], generatedProc); + initVariable(p, res); + genObjectInit(p, res.typ, res.loc, true); + end; + for i := 1 to sonsLen(prc.typ.n)-1 do begin + param := prc.typ.n.sons[i].sym; + assignParam(p, param) + end; + + genStmts(p, prc.ast.sons[codePos]); // modifies p.locals, p.init, etc. + if sfPure in prc.flags then + generatedProc := ropef('$1 {$n$2$3$4}$n', + [header, p.s[cpsLocals], p.s[cpsInit], p.s[cpsStmts]]) + else begin + generatedProc := con(header, '{' + tnl); + if optStackTrace in prc.options then begin + getFrameDecl(p); + prepend(p.s[cpsInit], ropef( + 'F.procname = $1;$n' + + 'F.prev = framePtr;$n' + + 'F.filename = $2;$n' + + 'F.line = 0;$n' + + 'framePtr = (TFrame*)&F;$n', + [makeCString(prc.owner.name.s +{&} '.' +{&} prc.name.s), + makeCString(toFilename(prc.info))])); + end; + if optProfiler in prc.options then begin + if gProcProfile >= 64*1024 then // XXX: hard coded value! + InternalError(prc.info, 'too many procedures for profiling'); + useMagic(m, 'profileData'); + app(p.s[cpsLocals], 'ticks NIM_profilingStart;'+tnl); + if prc.loc.a < 0 then begin + appf(m.s[cfsDebugInit], 'profileData[$1].procname = $2;$n', + [toRope(gProcProfile), + makeCString(prc.owner.name.s +{&} '.' +{&} prc.name.s)]); + prc.loc.a := gProcProfile; + inc(gProcProfile); + end; + prepend(p.s[cpsInit], toRope('NIM_profilingStart = getticks();' + tnl)); + end; + app(generatedProc, con(p.s)); + if p.beforeRetNeeded then + app(generatedProc, 'BeforeRet: ;' + tnl); + if optStackTrace in prc.options then + app(generatedProc, 'framePtr = framePtr->prev;' + tnl); + if optProfiler in prc.options then + appf(generatedProc, + 'profileData[$1].total += elapsed(getticks(), NIM_profilingStart);$n', + [toRope(prc.loc.a)]); + app(generatedProc, returnStmt); + app(generatedProc, '}' + tnl); + end; + app(m.s[cfsProcs], generatedProc); +end; + +procedure genProcPrototype(m: BModule; sym: PSym); +begin + useHeader(m, sym); + if (lfNoDecl in sym.loc.Flags) then exit; + if lfDynamicLib in sym.loc.Flags then begin + if (sym.owner.id <> m.module.id) and + not intSetContainsOrIncl(m.declaredThings, sym.id) then begin + appf(m.s[cfsVars], 'extern $1 Dl_$2;$n', + [getTypeDesc(m, sym.loc.t), toRope(sym.id)]) + end end + else begin + if not IntSetContainsOrIncl(m.declaredProtos, sym.id) then + appf(m.s[cfsProcHeaders], '$1;$n', [genProcHeader(m, sym)]); + end +end; + +procedure genProcNoForward(m: BModule; prc: PSym); +begin + fillProcLoc(prc); + useHeader(m, prc); + genProcPrototype(m, prc); + if (lfNoDecl in prc.loc.Flags) then exit; + if prc.typ.callConv = ccInline then begin + // We add inline procs to the calling module to enable C based inlining. + // This also means that a check with ``gGeneratedSyms`` is wrong, we need + // a check for ``m.declaredThings``. + if not intSetContainsOrIncl(m.declaredThings, prc.id) then + genProcAux(m, prc); + end + else if lfDynamicLib in prc.loc.flags then begin + if not IntSetContainsOrIncl(gGeneratedSyms, prc.id) then + SymInDynamicLib(findPendingModule(m, prc), prc); + end + else if not (sfImportc in prc.flags) then begin + if not IntSetContainsOrIncl(gGeneratedSyms, prc.id) then + genProcAux(findPendingModule(m, prc), prc); + end +end; + +procedure genProc(m: BModule; prc: PSym); +begin + fillProcLoc(prc); + if [sfForward, sfFromGeneric] * prc.flags <> [] then + addForwardedProc(m, prc) + else + genProcNoForward(m, prc) end; procedure genVarPrototype(m: BModule; sym: PSym); @@ -522,7 +601,8 @@ end; procedure genConstPrototype(m: BModule; sym: PSym); begin useHeader(m, sym); - fillLoc(sym.loc, locData, sym.typ, mangleName(sym), OnUnknown); + if sym.loc.k = locNone then + fillLoc(sym.loc, locData, sym.typ, mangleName(sym), OnUnknown); if (lfNoDecl in sym.loc.Flags) or intSetContainsOrIncl(m.declaredThings, sym.id) then exit; @@ -535,32 +615,6 @@ begin end end; -procedure genProcPrototype(m: BModule; sym: PSym); -begin - useHeader(m, sym); - fillLoc(sym.loc, locProc, sym.typ, mangleName(sym), OnStack); - if lfDynamicLib in sym.loc.Flags then begin - // it is a proc variable! - if (sym.owner.id <> m.module.id) and - not intSetContainsOrIncl(m.declaredThings, sym.id) then begin - app(m.s[cfsVars], 'extern '); - // BUGFIX: declareGlobalVar() inlined, because of intSetContainsOrIncl - // check - app(m.s[cfsVars], getTypeDesc(m, sym.loc.t)); - appf(m.s[cfsVars], ' $1;$n', [sym.loc.r]) - end - end - else begin - // it is a proc: - if (lfNoDecl in sym.loc.Flags) then exit; - if intSetContainsOrIncl(m.declaredThings, sym.id) then exit; - appf(m.s[cfsProcHeaders], '$1;$n', [genProcHeader(m, sym)]); - if (sym.typ.callConv = ccInline) - and (sym.owner.id <> m.module.id) then - genProc(m, sym) // generate the code again! - end -end; - function getFileHeader(const cfilenoext: string): PRope; begin if optCompileOnly in gGlobalOptions then @@ -593,6 +647,7 @@ procedure genMainProc(m: BModule); const CommonMainBody = ' setStackBottom(dummy);$n' + + ' nim__datInit();$n' + ' systemInit();$n' + '$1' + '$2'; @@ -652,8 +707,7 @@ var initname: PRope; begin initname := getInitName(m); - appf(mainModProcs, 'N_NOINLINE(void, $1)(void);$n', - [initname]); + appf(mainModProcs, 'N_NOINLINE(void, $1)(void);$n', [initname]); if not (sfSystemModule in m.flags) then appf(mainModInit, '$1();$n', [initname]); end; @@ -669,14 +723,18 @@ begin {@discard} lists.IncludeStr(m.headerFiles, ''); end; initname := getInitName(m.module); - registerModuleToMain(m.module); prc := ropef('N_NOINLINE(void, $1)(void) {$n', [initname]); - if m.typeNodes > 0 then + + if m.typeNodes > 0 then begin + useMagic(m, 'TNimNode'); appf(m.s[cfsTypeInit1], 'static TNimNode $1[$2];$n', - [m.typeNodesName, toRope(m.typeNodes)]); - if m.nimTypes > 0 then + [m.typeNodesName, toRope(m.typeNodes)]); + end; + if m.nimTypes > 0 then begin + useMagic(m, 'TNimType'); appf(m.s[cfsTypeInit1], 'static TNimType $1[$2];$n', [m.nimTypesName, toRope(m.nimTypes)]); + end; if optStackTrace in m.initProc.options then begin getFrameDecl(m.initProc); app(prc, m.initProc.s[cpsLocals]); @@ -716,7 +774,7 @@ begin for i := low(TCFileSection) to cfsProcs do app(result, m.s[i]) end; -function newModule(module: PSym; const filename: string): BModule; +function rawNewModule(module: PSym; const filename: string): BModule; begin new(result); {@ignore} @@ -724,7 +782,7 @@ begin {@emit} InitLinkedList(result.headerFiles); intSetInit(result.declaredThings); - intSetInit(result.debugDeclared); + intSetInit(result.declaredProtos); result.cfilename := filename; result.filename := filename; initIdTable(result.typeCache); @@ -735,12 +793,36 @@ begin result.initProc.options := gOptions; initNodeTable(result.dataCache); {@emit result.typeStack := @[];} +{@emit result.forwardedProcs := @[];} result.typeNodesName := getTempName(); result.nimTypesName := getTempName(); end; +function newModule(module: PSym; const filename: string): BModule; +begin + result := rawNewModule(module, filename); + if (optDeadCodeElim in gGlobalOptions) then begin + if (sfDeadCodeElim in module.flags) then + InternalError('added pending module twice: ' + filename); + addPendingModule(result) + end; +end; + +procedure registerTypeInfoModule(); +const + moduleName = 'nim__dat'; +var + s: PSym; +begin + s := NewSym(skModule, getIdent(moduleName), nil); + gmti := rawNewModule(s, joinPath(options.projectPath, moduleName)+'.nim'); + addPendingModule(gmti); + appf(mainModProcs, 'N_NOINLINE(void, $1)(void);$n', [getInitName(s)]); +end; + function myOpen(module: PSym; const filename: string): PPassContext; begin + if gmti = nil then registerTypeInfoModule(); result := newModule(module, filename); end; @@ -749,6 +831,7 @@ function myOpenCached(module: PSym; const filename: string; var cfile, cfilenoext, objFile: string; begin + if gmti = nil then registerTypeInfoModule(); //MessageOut('cgen.myOpenCached has been called ' + filename); cfile := changeFileExt(completeCFilePath(filename), cExt); cfilenoext := changeFileExt(cfile, ''); @@ -761,6 +844,8 @@ begin end; *) addFileToLink(cfilenoext); registerModuleToMain(module); + // XXX: this cannot be right here, initalization has to be appended during + // the ``myClose`` call result := nil; end; @@ -790,11 +875,52 @@ begin genStmts(m.initProc, n); end; -function myClose(b: PPassContext; n: PNode): PNode; +procedure finishModule(m: BModule); +var + i: int; + prc: PSym; +begin + i := 0; + while i <= high(m.forwardedProcs) do begin + // Note: ``genProc`` may add to ``m.forwardedProcs``, so we cannot use + // a for loop here + prc := m.forwardedProcs[i]; + if sfForward in prc.flags then InternalError(prc.info, 'still forwarded'); + genProcNoForward(m, prc); + inc(i); + end; + assert(gForwardedProcsCounter >= i); + dec(gForwardedProcsCounter, i); + setLength(m.forwardedProcs, 0); +end; + +procedure writeModule(m: BModule); var cfile, cfilenoext: string; - m: BModule; code: PRope; +begin + // generate code for the init statements of the module: + genInitCode(m); + finishTypeDescriptions(m); + + cfile := completeCFilePath(m.cfilename); + cfilenoext := changeFileExt(cfile, ''); + if sfMainModule in m.module.flags then begin + // generate main file: + app(m.s[cfsProcHeaders], mainModProcs); + end; + code := genModule(m, cfilenoext); + if shouldRecompile(code, changeFileExt(cfile, cExt), cfilenoext) then begin + addFileToCompile(cfilenoext); + end; + addFileToLink(cfilenoext); + if sfMainModule in m.module.flags then writeMapping(cfile, gMapping); +end; + +function myClose(b: PPassContext; n: PNode): PNode; +var + m: BModule; + i: int; begin result := n; if b = nil then exit; @@ -803,22 +929,24 @@ begin m.initProc.options := gOptions; genStmts(m.initProc, n); end; - // generate code for the init statements of the module: - genInitCode(m); - finishTypeDescriptions(m); - cfile := completeCFilePath(m.cfilename); - cfilenoext := changeFileExt(cfile, ''); + registerModuleToMain(m.module); + if not (optDeadCodeElim in gGlobalOptions) and + not (sfDeadCodeElim in m.module.flags) then + finishModule(m); if sfMainModule in m.module.flags then begin - // generate main file: - app(m.s[cfsProcHeaders], mainModProcs); genMainProc(m); + // we need to process the transitive closure because recursive module + // deps are allowed (and the system module is processed in the wrong + // order anyway) + while gForwardedProcsCounter > 0 do + for i := 0 to high(gPendingModules) do + finishModule(gPendingModules[i]); + for i := 0 to high(gPendingModules) do writeModule(gPendingModules[i]); + setLength(gPendingModules, 0); end; - code := genModule(m, cfilenoext); - if shouldRecompile(code, changeFileExt(cfile, cExt), cfilenoext) then begin - addFileToCompile(cfilenoext); // is to compile - end; - addFileToLink(cfilenoext); - if sfMainModule in m.module.flags then writeMapping(cfile, gMapping); + if not (optDeadCodeElim in gGlobalOptions) and + not (sfDeadCodeElim in m.module.flags) then + writeModule(m); end; function cgenPass(): TPass; @@ -832,4 +960,5 @@ end; initialization InitIiTable(gToTypeInfoId); + IntSetInit(gGeneratedSyms); end. diff --git a/nim/commands.pas b/nim/commands.pas index be863e917..d87a8f084 100644 --- a/nim/commands.pas +++ b/nim/commands.pas @@ -39,14 +39,14 @@ const {$ifdef fpc} compileDate = {$I %date%}; {$else} - compileDate = '2008-0-0'; + compileDate = '2009-0-0'; {$endif} {@emit} const HelpMessage = 'Nimrod Compiler Version $1 (' +{&} compileDate +{&} ') [$2: $3]' +{&} nl +{&} - 'Copyright (c) 2004-2008 by Andreas Rumpf' +{&} nl; + 'Copyright (c) 2004-2009 by Andreas Rumpf' +{&} nl; const Usage = '' @@ -82,6 +82,7 @@ const +{&} ' --bound_checks:on|off code generation for bound checks ON|OFF' +{&} nl +{&} ' --overflow_checks:on|off code generation for over-/underflow checks ON|OFF' +{&} nl +{&} ' -a, --assertions:on|off code generation for assertions ON|OFF' +{&} nl ++{&} ' --dead_code_elim:on|off whole program dead code elimination ON|OFF' +{&} nl +{&} ' --opt:none|speed|size optimize not at all or for speed|size' +{&} nl +{&} ' --app:console|gui|lib generate a console|GUI application or a shared lib' +{&} nl +{&} ' -r, --run run the compiled program with given arguments' +{&} nl @@ -96,7 +97,7 @@ const // cog.outl(f(line)) //]]] +{&} 'Advanced commands::' +{&} nl -+{&} ' pas convert a Pascal file to Nimrod standard syntax' +{&} nl ++{&} ' pas convert a Pascal file to Nimrod syntax' +{&} nl +{&} ' pretty pretty print the inputfile' +{&} nl +{&} ' gen_depend generate a DOT file containing the' +{&} nl +{&} ' module dependency graph' +{&} nl @@ -135,8 +136,8 @@ const function getCommandLineDesc: string; begin - result := format(HelpMessage, [VersionAsString, platform.os[hostOS].name, - cpu[hostCPU].name]) +{&} Usage + result := format(HelpMessage, [VersionAsString, + platform.os[platform.hostOS].name, cpu[platform.hostCPU].name]) +{&} Usage end; var @@ -157,8 +158,10 @@ procedure writeAdvancedUsage(pass: TCmdLinePass); begin if (pass = passCmd1) and not advHelpWritten then begin // BUGFIX 19 - MessageOut(format(HelpMessage, [VersionAsString, platform.os[hostOS].name, - cpu[hostCPU].name]) +{&} AdvancedUsage); + MessageOut(format(HelpMessage, [VersionAsString, + platform.os[platform.hostOS].name, + cpu[platform.hostCPU].name]) +{&} + AdvancedUsage); advHelpWritten := true; helpWritten := true; halt(0); @@ -170,8 +173,9 @@ begin if (pass = passCmd1) and not versionWritten then begin versionWritten := true; helpWritten := true; - messageOut(format(HelpMessage, [VersionAsString, platform.os[hostOS].name, - cpu[hostCPU].name])) + messageOut(format(HelpMessage, [VersionAsString, + platform.os[platform.hostOS].name, + cpu[platform.hostCPU].name])) end end; @@ -388,6 +392,7 @@ begin wOverflowChecks: ProcessOnOffSwitch({@set}[optOverflowCheck], arg, pass, info); wLineDir: ProcessOnOffSwitch({@set}[optLineDir], arg, pass, info); wAssertions, wA: ProcessOnOffSwitch({@set}[optAssert], arg, pass, info); + wDeadCodeElim: ProcessOnOffSwitchG({@set}[optDeadCodeElim], arg, pass, info); wOpt: begin case whichKeyword(arg) of wSpeed: begin @@ -453,7 +458,7 @@ begin theOS := platform.NameToOS(arg); if theOS = osNone then liMessage(info, errUnknownOS, arg); - if theOS <> hostOS then begin + if theOS <> platform.hostOS then begin setTarget(theOS, targetCPU); include(gGlobalOptions, optCompileOnly); condsyms.InitDefines() @@ -465,7 +470,7 @@ begin cpu := platform.NameToCPU(arg); if cpu = cpuNone then liMessage(info, errUnknownCPU, arg); - if cpu <> hostCPU then begin + if cpu <> platform.hostCPU then begin setTarget(targetOS, cpu); include(gGlobalOptions, optCompileOnly); condsyms.InitDefines() diff --git a/nim/docgen.pas b/nim/docgen.pas index 19dc93a91..bd4613180 100644 --- a/nim/docgen.pas +++ b/nim/docgen.pas @@ -218,8 +218,6 @@ begin end; function nextSplitPoint(const s: string; start: int): int; -var - i: int; begin result := start; while result < length(s)+strStart do begin @@ -227,7 +225,7 @@ begin '_': exit; 'a'..'z': begin if result+1 < length(s)+strStart then - if s[result+1] in ['A'..'Z'] then exit; + if s[result+1] in ['A'..'Z'] then exit; end; else begin end; end; @@ -393,7 +391,8 @@ begin fillChar(r, sizeof(r), 0); {@emit} comm := genRecComment(d, n); // call this here for the side-effect! - initTokRender(r, n, {@set}[renderNoPragmas, renderNoBody]); + initTokRender(r, n, {@set}[renderNoPragmas, renderNoBody, renderNoComments, + renderDocComments]); while true do begin getNextTok(r, kind, literal); case kind of @@ -579,7 +578,7 @@ begin end; rnHyperlink: begin result := ropef('`$1 <$2>`_', [renderRstToRst(d, n.sons[0]), - renderRstToRst(d, n.sons[1])]); + renderRstToRst(d, n.sons[1])]); end; rnGeneralRole: begin result := renderRstToRst(d, n.sons[0]); @@ -661,21 +660,26 @@ begin result := ropef('
    $1
', [result]); end; +function fieldAux(const s: string): PRope; +begin + result := toRope(strip(s)) +end; + function renderImage(d: PDoc; n: PRstNode): PRope; var s: string; begin result := ropef(' '' then appf(result, ' height="$1"', [toRope(s)]); + if s <> '' then appf(result, ' height="$1"', [fieldAux(s)]); s := getFieldValue(n, 'width'); - if s <> '' then appf(result, ' width="$1"', [toRope(s)]); + if s <> '' then appf(result, ' width="$1"', [fieldAux(s)]); s := getFieldValue(n, 'scale'); - if s <> '' then appf(result, ' scale="$1"', [toRope(s)]); + if s <> '' then appf(result, ' scale="$1"', [fieldAux(s)]); s := getFieldValue(n, 'alt'); - if s <> '' then appf(result, ' alt="$1"', [toRope(s)]); + if s <> '' then appf(result, ' alt="$1"', [fieldAux(s)]); s := getFieldValue(n, 'align'); - if s <> '' then appf(result, ' align="$1"', [toRope(s)]); + if s <> '' then appf(result, ' align="$1"', [fieldAux(s)]); app(result, ' />'); if rsonsLen(n) >= 3 then app(result, renderRstToHtml(d, n.sons[2])) end; @@ -863,15 +867,18 @@ begin nkConverterDef: genItem(d, n, n.sons[namePos], skConverter); nkVarSection: begin for i := 0 to sonsLen(n)-1 do - genItem(d, n.sons[i], n.sons[i].sons[0], skVar); + if n.sons[i].kind <> nkCommentStmt then + genItem(d, n.sons[i], n.sons[i].sons[0], skVar); end; nkConstSection: begin for i := 0 to sonsLen(n)-1 do - genItem(d, n.sons[i], n.sons[i].sons[0], skConst); + if n.sons[i].kind <> nkCommentStmt then + genItem(d, n.sons[i], n.sons[i].sons[0], skConst); end; nkTypeSection: begin for i := 0 to sonsLen(n)-1 do - genItem(d, n.sons[i], n.sons[i].sons[0], skType); + if n.sons[i].kind <> nkCommentStmt then + genItem(d, n.sons[i], n.sons[i].sons[0], skType); end; nkStmtList: begin for i := 0 to sonsLen(n)-1 do generateDoc(d, n.sons[i]); diff --git a/nim/ecmasgen.pas b/nim/ecmasgen.pas index d50be9b0c..c9dfcfe25 100644 --- a/nim/ecmasgen.pas +++ b/nim/ecmasgen.pas @@ -896,7 +896,8 @@ begin or (skipGeneric(y.typ).kind in [tyRef, tyPtr, tyVar]) end; -procedure genAsgnAux(var p: TProc; x, y: PNode; var r: TCompRes); +procedure genAsgnAux(var p: TProc; x, y: PNode; var r: TCompRes; + noCopyNeeded: bool); var a, b: TCompRes; begin @@ -906,7 +907,7 @@ begin etyObject: begin if a.com <> nil then appf(r.com, '$1;$n', [a.com]); if b.com <> nil then appf(r.com, '$1;$n', [b.com]); - if needsNoCopy(y) then + if needsNoCopy(y) or noCopyNeeded then appf(r.com, '$1 = $2;$n', [a.res, b.res]) else begin useMagic(p, 'NimCopy'); @@ -930,7 +931,13 @@ end; procedure genAsgn(var p: TProc; n: PNode; var r: TCompRes); begin genLineDir(p, n, r); - genAsgnAux(p, n.sons[0], n.sons[1], r); + genAsgnAux(p, n.sons[0], n.sons[1], r, false); +end; + +procedure genFastAsgn(var p: TProc; n: PNode; var r: TCompRes); +begin + genLineDir(p, n, r); + genAsgnAux(p, n.sons[0], n.sons[1], r, true); end; procedure genSwap(var p: TProc; n: PNode; var r: TCompRes); @@ -1692,6 +1699,7 @@ begin nkReturnStmt: genReturnStmt(p, n, r); nkBreakStmt: genBreakStmt(p, n, r); nkAsgn: genAsgn(p, n, r); + nkFastAsgn: genFastAsgn(p, n, r); nkDiscardStmt: begin genLineDir(p, n, r); gen(p, n.sons[0], r); diff --git a/nim/evals.pas b/nim/evals.pas index bb14f8be9..f9ca85c8f 100644 --- a/nim/evals.pas +++ b/nim/evals.pas @@ -28,7 +28,7 @@ type TStackFrame = record mapping: TIdNodeTable; // mapping from symbols to nodes prc: PSym; // current prc; proc that is evaluated - call: PNode; // current for stmt + call: PNode; next: PStackFrame; // for stacking params: TNodeSeq; // parameters passed to the proc end; @@ -127,7 +127,7 @@ begin inc(i) end; if (i < len) and (sonsLen(n.sons[i]) < 2) then // eval else-part - result := evalAux(c, n.sons[0]) + result := evalAux(c, n.sons[i].sons[0]) else result := emptyNode end; @@ -1227,7 +1227,7 @@ begin nkDerefExpr, nkHiddenDeref: result := evalDeref(c, n); nkAddr, nkHiddenAddr: result := evalAddr(c, n); nkHiddenStdConv, nkHiddenSubConv, nkConv: result := evalConv(c, n); - nkAsgn: result := evalAsgn(c, n); + nkAsgn, nkFastAsgn: result := evalAsgn(c, n); nkWhenStmt, nkIfStmt, nkIfExpr: result := evalIf(c, n); nkWhileStmt: result := evalWhile(c, n); nkCaseStmt: result := evalCase(c, n); @@ -1259,7 +1259,7 @@ begin nkTemplateDef, nkConstSection, nkIteratorDef, nkConverterDef, nkIncludeStmt, nkImportStmt, nkFromStmt: begin end; nkIdentDefs, nkCast, nkYieldStmt, nkAsmStmt, nkForStmt, nkPragmaExpr, - nkQualified, nkLambda, nkContinueStmt: + nkQualified, nkLambda, nkContinueStmt, nkIdent: stackTrace(c, n, errCannotInterpretNodeX, nodeKindToStr[n.kind]); else InternalError(n.info, 'evalAux: ' + nodekindToStr[n.kind]); end; diff --git a/nim/extccomp.pas b/nim/extccomp.pas index 5bc7011c1..51cf009d1 100644 --- a/nim/extccomp.pas +++ b/nim/extccomp.pas @@ -343,17 +343,11 @@ begin result := ccNone end; - -procedure addStr(var dest: string; const src: string); -begin - dest := dest +{&} src; -end; - procedure addOpt(var dest: string; const src: string); begin if (length(dest) = 0) or (dest[length(dest)-1+strStart] <> ' ') then - addStr(dest, ' '+''); - addStr(dest, src); + add(dest, ' '+''); + add(dest, src); end; procedure addCompileOption(const option: string); @@ -473,40 +467,52 @@ begin key := cc[c].name + '.exe'; if existsConfigVar(key) then exe := getConfigVar(key); + if targetOS = osWindows then exe := appendFileExt(exe, 'exe'); if (optGenDynLib in gGlobalOptions) and (ospNeedsPIC in platform.OS[targetOS].props) then - addStr(options, ' ' + cc[c].pic); + add(options, ' ' + cc[c].pic); - if targetOS = hostOS then begin + if targetOS = platform.hostOS then begin // compute include paths: includeCmd := cc[c].includeCmd; // this is more complex than needed, but // a workaround of a FPC bug... - addStr(includeCmd, libpath); - compilePattern := quoteIfSpaceExists(JoinPath(ccompilerpath, exe)); + add(includeCmd, quoteIfContainsWhite(libpath)); + compilePattern := JoinPath(ccompilerpath, exe); end else begin includeCmd := ''; compilePattern := cc[c].compilerExe end; - if targetOS = hostOS then + if targetOS = platform.hostOS then cfile := cfilename else cfile := extractFileName(cfilename); - if not isExternal or (targetOS <> hostOS) then + if not isExternal or (targetOS <> platform.hostOS) then objfile := toObjFile(cfile) else objfile := completeCFilePath(toObjFile(cfile)); - - result := format(compilePattern +{&} ' ' +{&} cc[c].compileTmpl, - ['file', AppendFileExt(cfile, cExt), + cfile := quoteIfContainsWhite(AppendFileExt(cfile, cExt)); + objfile := quoteIfContainsWhite(objfile); + + result := quoteIfContainsWhite(format(compilePattern, + ['file', cfile, 'objfile', objfile, 'options', options, 'include', includeCmd, 'nimrod', getPrefixDir(), 'lib', libpath - ]); + ])); + add(result, ' '); + add(result, format(cc[c].compileTmpl, + ['file', cfile, + 'objfile', objfile, + 'options', options, + 'include', includeCmd, + 'nimrod', quoteIfContainsWhite(getPrefixDir()), + 'lib', quoteIfContainsWhite(libpath) + ])); end; procedure CompileCFile(const list: TLinkedList; @@ -551,11 +557,12 @@ begin // call the linker: linkerExe := getConfigVar(cc[c].name + '.linkerexe'); if length(linkerExe) = 0 then linkerExe := cc[c].linkerExe; + if targetOS = osWindows then linkerExe := appendFileExt(linkerExe, 'exe'); - if (hostOS <> targetOS) then - linkCmd := linkerExe + if (platform.hostOS <> targetOS) then + linkCmd := quoteIfContainsWhite(linkerExe) else - linkCmd := quoteIfSpaceExists(JoinPath(ccompilerpath, linkerExe)); + linkCmd := quoteIfContainsWhite(JoinPath(ccompilerpath, linkerExe)); if optGenDynLib in gGlobalOptions then buildDll := cc[c].buildDll @@ -570,27 +577,29 @@ begin exefile := platform.os[targetOS].dllPrefix else exefile := ''; - if targetOS = hostOS then - addStr(exefile, projectFile) + if targetOS = platform.hostOS then + add(exefile, projectFile) else - addStr(exefile, extractFileName(projectFile)); + add(exefile, extractFileName(projectFile)); if optGenDynLib in gGlobalOptions then - addStr(exefile, platform.os[targetOS].dllExt) + add(exefile, platform.os[targetOS].dllExt) else - addStr(exefile, platform.os[targetOS].exeExt); + add(exefile, platform.os[targetOS].exeExt); + exefile := quoteIfContainsWhite(exefile); it := PStrEntry(toLink.head); objfiles := ''; while it <> nil do begin - addStr(objfiles, ' '+''); - if targetOS = hostOS then - addStr(objfiles, toObjfile(it.data)) + add(objfiles, ' '+''); + if targetOS = platform.hostOS then + add(objfiles, quoteIfContainsWhite(toObjfile(it.data))) else - addStr(objfiles, toObjfile(extractFileName(it.data))); + add(objfiles, quoteIfContainsWhite( + toObjfile(extractFileName(it.data)))); it := PStrEntry(it.next); end; - linkCmd := format(linkCmd +{&} ' ' +{&} cc[c].linkTmpl, [ + linkCmd := quoteIfContainsWhite(format(linkCmd, [ 'builddll', builddll, 'buildgui', buildgui, 'options', linkOptions, @@ -598,7 +607,18 @@ begin 'exefile', exefile, 'nimrod', getPrefixDir(), 'lib', libpath - ]); + ])); + add(linkCmd, ' '); + add(linkCmd, format(cc[c].linkTmpl, [ + 'builddll', builddll, + 'buildgui', buildgui, + 'options', linkOptions, + 'objfiles', objfiles, + 'exefile', exefile, + 'nimrod', quoteIfContainsWhite(getPrefixDir()), + 'lib', quoteIfContainsWhite(libpath) + ])); + if not (optCompileOnly in gGlobalOptions) then execExternalProgram(linkCmd); end // end if not noLinking diff --git a/nim/hashes.pas b/nim/hashes.pas index 1bd3c7d2a..0d7eb205d 100644 --- a/nim/hashes.pas +++ b/nim/hashes.pas @@ -61,7 +61,7 @@ begin result := x -{%} 1; // complicated, to make it a nop if sizeof(int) == 4, // because shifting more than 31 bits is undefined in C - result := result or (result shr ((sizeof(int)-4)* 32)); + result := result or (result shr ((sizeof(int)-4)* 8)); result := result or (result shr 16); result := result or (result shr 8); result := result or (result shr 4); diff --git a/nim/lexbase.pas b/nim/lexbase.pas index 11200f652..2b056c04f 100644 --- a/nim/lexbase.pas +++ b/nim/lexbase.pas @@ -64,7 +64,7 @@ function getCurrentLine(const L: TBaseLexer; marker: boolean = true): string; function getColNumber(const L: TBaseLexer; pos: int): int; function HandleCR(var L: TBaseLexer; pos: int): int; -// Call this if you scanned over CR in the buffer; it returns the the +// Call this if you scanned over CR in the buffer; it returns the // position to continue the scanning from. `pos` must be the position // of the CR. @@ -211,8 +211,7 @@ end; function getColNumber(const L: TBaseLexer; pos: int): int; begin - result := pos - L.lineStart; - assert(result >= 0); + result := abs(pos - L.lineStart); end; function getCurrentLine(const L: TBaseLexer; marker: boolean = true): string; diff --git a/nim/magicsys.pas b/nim/magicsys.pas index 55ec0b002..7a717e61d 100644 --- a/nim/magicsys.pas +++ b/nim/magicsys.pas @@ -96,9 +96,10 @@ begin result := StrTableGet(compilerprocs, ident); if result = nil then begin result := StrTableGet(rodCompilerProcs, ident); - if result = nil then rawMessage(errSystemNeeds, name); - strTableAdd(compilerprocs, result); - if result.kind = skStub then loadStub(result); + if result <> nil then begin + strTableAdd(compilerprocs, result); + if result.kind = skStub then loadStub(result); + end; // A bit hacky that this code is needed here, but it is the easiest // solution in order to avoid special cases for sfCompilerProc in the // rodgen module. Another solution would be to always recompile the system diff --git a/nim/msgs.pas b/nim/msgs.pas index d65a5a1e4..a91c328ef 100644 --- a/nim/msgs.pas +++ b/nim/msgs.pas @@ -173,7 +173,7 @@ type errSelectorMustBeOrdinal, errOrdXMustNotBeNegative, errLenXinvalid, - errWrongNumberOfLoopVariables, + errWrongNumberOfVariables, errExprCannotBeRaised, errBreakOnlyInLoop, errTypeXhasUnknownSize, @@ -431,7 +431,7 @@ const 'selector must be of an ordinal type', 'ord($1) must not be negative', 'len($1) must be less than 32768', - 'wrong number of loop variables', + 'wrong number of variables', 'only objects can be raised', '''break'' only allowed in loop construct', 'type ''$1'' has unknown size', diff --git a/nim/nimrod.pas b/nim/nimrod.pas index d197a3448..99d9a9d0f 100644 --- a/nim/nimrod.pas +++ b/nim/nimrod.pas @@ -93,7 +93,8 @@ begin } end; if optRun in gGlobalOptions then - execExternalProgram(changeFileExt(filename, '') +{&} ' ' +{&} arguments) + execExternalProgram(quoteIfContainsWhite(changeFileExt(filename, '')) +{&} + ' ' +{&} arguments) end end; diff --git a/nim/nos.pas b/nim/nos.pas index 002803b53..73b17ae58 100644 --- a/nim/nos.pas +++ b/nim/nos.pas @@ -35,9 +35,11 @@ const {$ifdef mswindows} dirsep = '\'; // seperator within paths altsep = '/'; + exeExt = 'exe'; {$else} dirsep = '/'; altsep = #0; // work around fpc bug + exeExt = ''; {$endif} pathSep = ';'; // seperator between paths sep = dirsep; // alternative name diff --git a/nim/nsystem.pas b/nim/nsystem.pas index c33236189..f476e09ca 100644 --- a/nim/nsystem.pas +++ b/nim/nsystem.pas @@ -149,8 +149,12 @@ function subU(a, b: biggestInt): biggestInt; function mulU(a, b: biggestInt): biggestInt; function divU(a, b: biggestInt): biggestInt; function modU(a, b: biggestInt): biggestInt; -function shlU(a, b: biggestInt): biggestInt; -function shrU(a, b: biggestInt): biggestInt; +function shlU(a, b: biggestInt): biggestInt; overload; +function shrU(a, b: biggestInt): biggestInt; overload; + +function shlU(a, b: Int32): Int32;overload; +function shrU(a, b: int32): int32;overload; + function ltU(a, b: biggestInt): bool; function leU(a, b: biggestInt): bool; @@ -281,6 +285,16 @@ begin result := biggestInt(biggestUInt(a) shr biggestUInt(b)); end; +function shlU(a, b: Int32): Int32; +begin + result := Int32(UInt32(a) shl UInt32(b)); +end; + +function shrU(a, b: int32): int32; +begin + result := Int32(UInt32(a) shr UInt32(b)); +end; + function ltU(a, b: biggestInt): bool; begin result := biggestUInt(a) < biggestUInt(b); diff --git a/nim/nversion.pas b/nim/nversion.pas index 9629079b2..7d179bb35 100644 --- a/nim/nversion.pas +++ b/nim/nversion.pas @@ -31,10 +31,10 @@ const //cog.outl('VersionMinor = %s;' % ver[1]) //cog.outl('VersionPatch = %s;' % ver[2]) //]]] - VersionAsString = '0.7.2'; + VersionAsString = '0.7.4'; VersionMajor = 0; VersionMinor = 7; - VersionPatch = 2; + VersionPatch = 4; //[[[[end]]]] implementation diff --git a/nim/optast.pas b/nim/optast.pas deleted file mode 100644 index 9f66a53db..000000000 --- a/nim/optast.pas +++ /dev/null @@ -1,34 +0,0 @@ -// -// -// The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf -// -// See the file "copying.txt", included in this -// distribution, for details about the copyright. -// - -unit optast; - -// Optimizations that can be done by AST transformations. The code generators -// should work without the optimizer. The optimizer does the following: - -// - cross-module constant merging -// - cross-module generic merging -// - lowers set operations to bit operations -// - inlining of procs -// - ``s == ""`` --> ``len(s) == 0`` -// - optimization of ``&`` string operator - -interface - -{$include 'config.inc'} - -uses - nsystem, ast, astalgo, strutils, hashes, trees, treetab, platform, magicsys, - options, msgs, crc, idents, lists, types, ropes, nmath, wordrecg, rnimsyn; - -implementation - - -end. - diff --git a/nim/options.pas b/nim/options.pas index 9a9eaae36..5bbfbbbee 100644 --- a/nim/options.pas +++ b/nim/options.pas @@ -201,6 +201,12 @@ begin if startsWith(dir, prefix) then begin result := ncopy(dir, length(prefix) + strStart); exit end; + prefix := projectPath +{&} dirSep; + //writeln(output, prefix); + //writeln(output, dir); + if startsWith(dir, prefix) then begin + result := ncopy(dir, length(prefix) + strStart); exit + end; result := dir end; @@ -209,7 +215,7 @@ var head, tail: string; begin splitPath(path, head, tail); - result := joinPath([projectPath, genSubDir, shortenDir(head), + result := joinPath([projectPath, genSubDir, shortenDir(head +{&} dirSep), changeFileExt(tail, ext)]) end; @@ -219,9 +225,11 @@ var head, tail, subdir: string; begin splitPath(f, head, tail); - subdir := joinPath([projectPath, genSubDir, shortenDir(head)]); - if createSubDir then + subdir := joinPath([projectPath, genSubDir, shortenDir(head +{&} dirSep)]); + if createSubDir then begin + //Writeln(output, subdir); createDir(subdir); + end; result := joinPath(subdir, tail) end; diff --git a/nim/parseopt.pas b/nim/parseopt.pas index d543b998e..0ca87bd37 100644 --- a/nim/parseopt.pas +++ b/nim/parseopt.pas @@ -51,7 +51,7 @@ begin else begin result.cmd := ''; for i := 1 to ParamCount() do - result.cmd := result.cmd +{&} quoteIfSpaceExists(paramStr(i)) +{&} ' '; + result.cmd := result.cmd +{&} quoteIfContainsWhite(paramStr(i)) +{&} ' '; {@ignore} result.cmd := result.cmd + #0; {@emit} diff --git a/nim/passaux.pas b/nim/passaux.pas index 6344efb0b..8b052257f 100644 --- a/nim/passaux.pas +++ b/nim/passaux.pas @@ -14,7 +14,7 @@ unit passaux; interface uses - nsystem, strutils, ast, passes, msgs, options; + nsystem, strutils, ast, astalgo, passes, msgs, options; function verbosePass: TPass; function cleanupPass: TPass; @@ -50,6 +50,8 @@ var s: PSym; begin result := n; + // we cannot clean up if dead code elimination is activated + if (optDeadCodeElim in gGlobalOptions) then exit; case n.kind of nkStmtList: begin for i := 0 to sonsLen(n)-1 do {@discard} cleanup(c, n.sons[i]); @@ -57,7 +59,8 @@ begin nkProcDef: begin if (n.sons[namePos].kind = nkSym) then begin s := n.sons[namePos].sym; - if not astNeeded(s) then s.ast.sons[codePos] := nil; // free the memory + if not (sfDeadCodeElim in getModule(s).flags) and + not astNeeded(s) then s.ast.sons[codePos] := nil; // free the memory end end else begin end; diff --git a/nim/platform.pas b/nim/platform.pas index 1c021db86..8bf4f3d9b 100644 --- a/nim/platform.pas +++ b/nim/platform.pas @@ -23,7 +23,7 @@ uses type TSystemOS = ( - // Also add OS for in initialization section and alias conditionals to + // Also add OS in initialization section and alias conditionals to // condsyms (end of module). osNone, osDos, @@ -264,8 +264,8 @@ const curDir: '.'+''; exeExt: ''; extSep: '.'+''; - props: {@set}[ospNeedsPIC, ospPosix]; - ), + props: {@set}[ospNeedsPIC, ospPosix]; + ), ( name: 'PalmOS'; parDir: '..'; diff --git a/nim/pnimsyn.pas b/nim/pnimsyn.pas index 2cb34e708..95d6e64f9 100644 --- a/nim/pnimsyn.pas +++ b/nim/pnimsyn.pas @@ -9,7 +9,7 @@ unit pnimsyn; // This module implements the parser of the standard Nimrod representation. -// The parser is strictly reflects the grammar ("doc/grammar.txt"); however +// The parser strictly reflects the grammar ("doc/grammar.txt"); however // it uses several helper routines to keep the parser small. A special // efficient algorithm is used for the precedence levels. The parser here can // be seen as a refinement of the grammar, as it specifies how the AST is build @@ -98,15 +98,21 @@ end; // ---------------- parser helpers -------------------------------------------- +procedure parMessage(const p: TParser; const msg: TMsgKind; + const arg: string = ''); +begin + lexMessage(p.lex^, msg, arg); +end; + procedure skipComment(var p: TParser; node: PNode); begin if p.tok.tokType = tkComment then begin if node <> nil then begin if node.comment = snil then node.comment := ''; - node.comment := node.comment +{&} p.tok.literal; + add(node.comment, p.tok.literal); end else - assert(false); + parMessage(p, errInternal, 'skipComment'); getTok(p); end end; @@ -116,6 +122,11 @@ begin if p.tok.tokType = tkInd then getTok(p) end; +procedure optSad(var p: TParser); +begin + if p.tok.tokType = tkSad then getTok(p) +end; + procedure optInd(var p: TParser; n: PNode); begin skipComment(p, n); @@ -146,12 +157,6 @@ begin else lexMessage(p.lex^, errTokenExpected, TokTypeToStr[tokType]) end; -procedure parMessage(const p: TParser; const msg: TMsgKind; - const arg: string = ''); -begin - lexMessage(p.lex^, msg, arg); -end; - function parLineInfo(const p: TParser): TLineInfo; begin result := getLineInfo(p.lex^) @@ -385,7 +390,7 @@ begin result := newNodeP(nkExprEqExpr, p); addSon(result, a); getTok(p); - optInd(p, result); + //optInd(p, result); case p.tok.tokType of tkVar, tkRef, tkPtr, tkProc: addSon(result, parseTypeDescK(p)); @@ -413,21 +418,16 @@ begin addSon(result, first); getTok(p); optInd(p, result); - while true do begin - if p.tok.tokType = tkBracketRi then begin - getTok(p); break - end; - if p.tok.tokType = tkEof then begin - parMessage(p, errTokenExpected, TokTypeToStr[tkBracketRi]); break - end; + while (p.tok.tokType <> tkBracketRi) and (p.tok.tokType <> tkEof) + and (p.tok.tokType <> tkSad) do begin a := namedTypeOrExpr(p); - optInd(p, a); - if p.tok.tokType = tkComma then begin - getTok(p); - optInd(p, a) - end; addSon(result, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) end; + optSad(p); + eat(p, tkBracketRi); end; function exprColonEqExpr(var p: TParser; kind: TNodeKind; @@ -439,7 +439,7 @@ begin if p.tok.tokType = tok then begin result := newNodeP(kind, p); getTok(p); - optInd(p, result); + //optInd(p, result); addSon(result, a); addSon(result, parseExpr(p)); end @@ -454,21 +454,14 @@ var begin getTok(p); optInd(p, result); - while true do begin - if p.tok.tokType = endTok then begin - getTok(p); break - end; - if p.tok.tokType = tkEof then begin - parMessage(p, errTokenExpected, TokTypeToStr[endtok]); break - end; + while (p.tok.tokType <> endTok) and (p.tok.tokType <> tkEof) do begin a := exprColonEqExpr(p, elemKind, sepTok); - optInd(p, a); - if p.tok.tokType = tkComma then begin - getTok(p); - optInd(p, a) - end; addSon(result, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) end; + eat(p, endTok); end; function qualifiedIdent(var p: TParser): PNode; @@ -476,7 +469,7 @@ var a: PNode; begin result := parseSymbol(p); - optInd(p, result); + //optInd(p, result); if p.tok.tokType = tkDot then begin getTok(p); optInd(p, result); @@ -494,28 +487,41 @@ var begin getTok(p); optInd(p, result); - while true do begin - if p.tok.tokType = endTok then begin - getTok(p); break - end; - if p.tok.tokType = tkEof then begin - parMessage(p, errTokenExpected, TokTypeToStr[endtok]); break - end; + while (p.tok.tokType <> endTok) and (p.tok.tokType <> tkEof) do begin a := qualifiedIdent(p); - optInd(p, a); - if p.tok.tokType = tkComma then begin - getTok(p); - optInd(p, a) - end; addSon(result, a); + //optInd(p, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) end; + eat(p, endTok); +end; + +procedure exprColonEqExprListAux(var p: TParser; elemKind: TNodeKind; + endTok, sepTok: TTokType; result: PNode); +var + a: PNode; +begin + getTok(p); + optInd(p, result); + while (p.tok.tokType <> endTok) and (p.tok.tokType <> tkEof) + and (p.tok.tokType <> tkSad) do begin + a := exprColonEqExpr(p, elemKind, sepTok); + addSon(result, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) + end; + optSad(p); + eat(p, endTok); end; function exprColonEqExprList(var p: TParser; kind, elemKind: TNodeKind; endTok, sepTok: TTokType): PNode; begin result := newNodeP(kind, p); - exprListAux(p, elemKind, endTok, sepTok, result); + exprColonEqExprListAux(p, elemKind, endTok, sepTok, result); end; function parseCast(var p: TParser): PNode; @@ -525,12 +531,12 @@ begin eat(p, tkBracketLe); optInd(p, result); addSon(result, parseTypeDesc(p)); - optInd(p, result); + optSad(p); eat(p, tkBracketRi); eat(p, tkParLe); optInd(p, result); addSon(result, parseExpr(p)); - optInd(p, result); + optSad(p); eat(p, tkParRi); end; @@ -541,7 +547,7 @@ begin eat(p, tkParLe); optInd(p, result); addSon(result, parseExpr(p)); - optInd(p, result); + optSad(p); eat(p, tkParRi); end; @@ -667,7 +673,7 @@ begin a := result; result := newNodeP(nkCall, p); addSon(result, a); - exprListAux(p, nkExprEqExpr, tkParRi, tkEquals, result); + exprColonEqExprListAux(p, nkExprEqExpr, tkParRi, tkEquals, result); end; tkDot: begin a := result; @@ -709,8 +715,9 @@ begin opNode := newIdentNodeP(op.ident, p); // skip operator: getTok(p); - skipComment(p, opNode); - skipInd(p); + //skipComment(p, opNode); + //skipInd(p); + optInd(p, opNode); // read sub-expression with higher priority nextop := lowestExprAux(p, v2, opPred); @@ -739,12 +746,12 @@ begin while true do begin getTok(p); // skip `if`, `elif` branch := newNodeP(nkElifExpr, p); - optInd(p, branch); + //optInd(p, branch); addSon(branch, parseExpr(p)); eat(p, tkColon); - optInd(p, branch); + //optInd(p, branch); addSon(branch, parseExpr(p)); - optInd(p, branch); + //optInd(p, branch); addSon(result, branch); if p.tok.tokType <> tkElif then break end; @@ -770,31 +777,33 @@ var begin result := newNodeP(nkPragma, p); getTok(p); - while true do begin - skipComment(p, result); - skipInd(p); - case p.tok.TokType of - tkCurlyDotRi, tkCurlyRi: begin - getTok(p); // skip } or .} - break - end; - tkEof: begin - parMessage(p, errTokenExpected, '.}'); - break - end - else begin - a := exprColonEqExpr(p, nkExprColonExpr, tkColon); - addSon(result, a); - if p.tok.tokType = tkComma then begin - getTok(p); - skipComment(p, a) - end - end + optInd(p, result); + while (p.tok.tokType <> tkCurlyDotRi) and (p.tok.tokType <> tkCurlyRi) + and (p.tok.tokType <> tkEof) and (p.tok.tokType <> tkSad) do begin + a := exprColonEqExpr(p, nkExprColonExpr, tkColon); + addSon(result, a); + if p.tok.tokType = tkComma then begin + getTok(p); + optInd(p, a) end - end + end; + optSad(p); + if (p.tok.tokType = tkCurlyDotRi) or (p.tok.tokType = tkCurlyRi) then + getTok(p) + else + parMessage(p, errTokenExpected, '.}'); end; // ---------------------- statement parser ------------------------------------ +function isExprStart(const p: TParser): bool; +begin + case p.tok.tokType of + tkSymbol, tkAccent, tkOpr, tkNot, tkNil, tkCast, tkIf, tkLambda, + tkParLe, tkBracketLe, tkCurlyLe, tkIntLit..tkCharLit: result := true; + else result := false; + end; +end; + function parseExprStmt(var p: TParser): PNode; var a, b, e: PNode; @@ -813,16 +822,16 @@ begin result.info := a.info; addSon(result, a); while true do begin - case p.tok.tokType of + (*case p.tok.tokType of tkColon, tkInd, tkSad, tkDed, tkEof, tkComment: break; else begin end - end; + end;*) + if not isExprStart(p) then break; e := parseExpr(p); - if p.tok.tokType = tkComma then begin - getTok(p); - skipComment(p, e) - end; addSon(result, e); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a); end; if sonsLen(result) <= 1 then result := a else a := result; @@ -897,7 +906,7 @@ begin break end; end; - optInd(p, a); + //optInd(p, a); if p.tok.tokType = tkAs then begin getTok(p); optInd(p, a); @@ -906,11 +915,10 @@ begin addSon(a, b); addSon(a, parseSymbol(p)); end; - if p.tok.tokType = tkComma then begin - getTok(p); - optInd(p, a) - end; addSon(result, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) end; end; @@ -942,12 +950,11 @@ begin break end; end; - optInd(p, a); - if p.tok.tokType = tkComma then begin - getTok(p); - optInd(p, a) - end; addSon(result, a); + //optInd(p, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) end; end; @@ -977,7 +984,7 @@ begin end end; addSon(result, a); - optInd(p, a); + //optInd(p, a); eat(p, tkImport); optInd(p, result); while true do begin @@ -989,12 +996,11 @@ begin break end; end; - optInd(p, a); - if p.tok.tokType = tkComma then begin - getTok(p); - optInd(p, a) - end; + //optInd(p, a); addSon(result, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) end; end; @@ -1074,6 +1080,7 @@ begin result := newNodeP(nkCaseStmt, p); getTok(p); addSon(result, parseExpr(p)); + if p.tok.tokType = tkColon then getTok(p); skipComment(p, result); inElif := false; while true do begin @@ -1145,22 +1152,15 @@ begin result := newNodeP(nkForStmt, p); getTok(p); optInd(p, result); - while true do begin - if p.tok.tokType = tkIn then begin - getTok(p); break - end; - if p.tok.tokType = tkEof then begin - parMessage(p, errTokenExpected, TokTypeToStr[tkIn]); break - end; - - a := parseSymbol(p); - if a = nil then break; + a := parseSymbol(p); + addSon(result, a); + while p.tok.tokType = tkComma do begin + getTok(p); optInd(p, a); - if p.tok.tokType = tkComma then begin - getTok(p); optInd(p, a) - end; - addSon(result, a); + a := parseSymbol(p); + addSon(result, a); end; + eat(p, tkIn); addSon(result, exprColonEqExpr(p, nkRange, tkDotDot)); eat(p, tkColon); skipComment(p, result); @@ -1246,12 +1246,11 @@ begin if a = nil then exit; end end; - optInd(p, a); - if p.tok.tokType = tkComma then begin - getTok(p); - optInd(p, a) - end; addSon(result, a); + //optInd(p, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) end; if p.tok.tokType = tkColon then begin getTok(p); optInd(p, result); @@ -1282,15 +1281,17 @@ begin while true do begin case p.tok.tokType of tkSymbol, tkAccent: a := parseIdentColonEquals(p, false); - tkParRi: begin getTok(p); break end; + tkParRi: break; else begin parMessage(p, errTokenExpected, ')'+''); break; end; end; - optInd(p, a); - if p.tok.tokType = tkComma then begin - getTok(p); optInd(p, a) - end; + //optInd(p, a); addSon(result, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) end; + optSad(p); + eat(p, tkParRi); end; if p.tok.tokType = tkColon then begin getTok(p); @@ -1336,18 +1337,15 @@ begin getTok(p); eat(p, tkBracketLe); optInd(p, result); - while true do begin - case p.tok.tokType of - tkSymbol, tkAccent: a := parseIdentColonEquals(p, false); - tkBracketRi: begin getTok(p); break end; - else begin parMessage(p, errTokenExpected, ']'+''); break; end; - end; - optInd(p, a); - if p.tok.tokType = tkComma then begin - getTok(p); optInd(p, a) - end; - addSon(result, a); + while (p.tok.tokType = tkSymbol) or (p.tok.tokType = tkAccent) do begin + a := parseIdentColonEquals(p, false); + addSon(result, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) end; + optSad(p); + eat(p, tkBracketRi); end; else begin InternalError(parLineInfo(p), 'pnimsyn.parseTypeDescK'); @@ -1389,18 +1387,15 @@ begin result := newNodeP(nkGenericParams, p); getTok(p); optInd(p, result); - while true do begin - case p.tok.tokType of - tkSymbol, tkAccent: a := parseGenericParam(p); - tkBracketRi: begin getTok(p); break end; - else begin parMessage(p, errTokenExpected, ']'+''); break; end; - end; - optInd(p, a); - if p.tok.tokType = tkComma then begin - getTok(p); optInd(p, a) - end; + while (p.tok.tokType = tkSymbol) or (p.tok.tokType = tkAccent) do begin + a := parseGenericParam(p); addSon(result, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) end; + optSad(p); + eat(p, tkBracketRi); end; function parseRoutine(var p: TParser; kind: TNodeKind): PNode; @@ -1484,7 +1479,8 @@ begin break end end - end + end; + popInd(p.lex^); end; tkSymbol, tkAccent: addSon(result, defparser(p)); else parMessage(p, errIdentifierExpected, tokToStr(p.tok)); @@ -1628,7 +1624,8 @@ begin break end end - end + end; + popInd(p.lex^); end; tkWhen: result := parseRecordWhen(p); tkCase: result := parseRecordCase(p); @@ -1688,9 +1685,34 @@ begin indAndComment(p, result); // special extension! end; +function parseVarTuple(var p: TParser): PNode; +var + a: PNode; +begin + result := newNodeP(nkVarTuple, p); + getTok(p); // skip '(' + optInd(p, result); + while (p.tok.tokType = tkSymbol) or (p.tok.tokType = tkAccent) do begin + a := identWithPragma(p); + addSon(result, a); + if p.tok.tokType <> tkComma then break; + getTok(p); + optInd(p, a) + end; + addSon(result, nil); // no type desc + optSad(p); + eat(p, tkParRi); + eat(p, tkEquals); + optInd(p, result); + addSon(result, parseExpr(p)); +end; + function parseVariable(var p: TParser): PNode; begin - result := parseIdentColonEquals(p, true); + if p.tok.tokType = tkParLe then + result := parseVarTuple(p) + else + result := parseIdentColonEquals(p, true); indAndComment(p, result); // special extension! end; @@ -1708,10 +1730,15 @@ begin tkFrom: result := parseFromStmt(p); tkInclude: result := parseIncludeStmt(p); tkComment: result := newCommentStmt(p); - //tkSad, tkInd, tkDed: assert(false); - else result := parseExprStmt(p) + else begin + if isExprStart(p) then + result := parseExprStmt(p) + else + result := nil; + end end; - skipComment(p, result); + if result <> nil then + skipComment(p, result); end; function complexOrSimpleStmt(var p: TParser): PNode; @@ -1738,6 +1765,8 @@ begin end; function parseStmt(var p: TParser): PNode; +var + a: PNode; begin if p.tok.tokType = tkInd then begin result := newNodeP(nkStmtList, p); @@ -1748,9 +1777,14 @@ begin tkSad: getTok(p); tkEof: break; tkDed: begin getTok(p); break end; - else addSon(result, complexOrSimpleStmt(p)); - end; - end + else begin + a := complexOrSimpleStmt(p); + if a = nil then break; + addSon(result, a); + end + end + end; + popInd(p.lex^); end else begin // the case statement is only needed for better error messages: @@ -1762,7 +1796,7 @@ begin end else begin result := simpleStmt(p); - skipComment(p, result); + if result = nil then parMessage(p, errExprExpected, tokToStr(p.tok)); if p.tok.tokType = tkSad then getTok(p); end end @@ -1770,6 +1804,8 @@ begin end; function parseModule(var p: TParser): PNode; +var + a: PNode; begin result := newNodeP(nkStmtList, p); while true do begin @@ -1777,7 +1813,11 @@ begin tkSad: getTok(p); tkDed, tkInd: parMessage(p, errInvalidIndentation); tkEof: break; - else addSon(result, complexOrSimpleStmt(p)); + else begin + a := complexOrSimpleStmt(p); + if a = nil then parMessage(p, errExprExpected, tokToStr(p.tok)); + addSon(result, a); + end end end end; @@ -1795,6 +1835,7 @@ begin tkEof: break; else begin result := complexOrSimpleStmt(p); + if result = nil then parMessage(p, errExprExpected, tokToStr(p.tok)); break end end diff --git a/nim/pragmas.pas b/nim/pragmas.pas index 68bc366f1..636a1198a 100644 --- a/nim/pragmas.pas +++ b/nim/pragmas.pas @@ -135,8 +135,8 @@ var v: string; m: TMagic; begin - if not (sfSystemModule in c.module.flags) then - liMessage(n.info, errMagicOnlyInSystem); + //if not (sfSystemModule in c.module.flags) then + // liMessage(n.info, errMagicOnlyInSystem); if n.kind <> nkExprColonExpr then liMessage(n.info, errStringLiteralExpected); if n.sons[1].kind = nkIdent then v := n.sons[1].ident.s @@ -172,6 +172,19 @@ begin liMessage(n.info, errOnOrOffExpected) end; +procedure pragmaDeadCodeElim(c: PContext; n: PNode); +begin + if (n.kind = nkExprColonExpr) and (n.sons[1].kind = nkIdent) then begin + case whichKeyword(n.sons[1].ident) of + wOn: include(c.module.flags, sfDeadCodeElim); + wOff: exclude(c.module.flags, sfDeadCodeElim); + else liMessage(n.info, errOnOrOffExpected) + end + end + else + liMessage(n.info, errOnOrOffExpected) +end; + procedure processCallConv(c: PContext; n: PNode); var sw: TSpecialWord; @@ -466,6 +479,7 @@ begin wVolatile: begin noVal(it); Include(sym.flags, sfVolatile); end; wRegister: begin noVal(it); include(sym.flags, sfRegister); end; wThreadVar: begin noVal(it); include(sym.flags, sfThreadVar); end; + wDeadCodeElim: pragmaDeadCodeElim(c, it); wMagic: processMagic(c, it, sym); wCompileTime: begin noVal(it); @@ -612,7 +626,7 @@ begin wHint, wWarning, wError, wFatal, wDefine, wUndef, wCompile, wLink, wLinkSys, wPure, wPush, wPop, wFixupSystem, wBreakpoint, wCheckpoint, - wPassL, wPassC]); + wPassL, wPassC, wDeadCodeElim]); end; procedure pragmaLambda(c: PContext; s: PSym; n: PNode); diff --git a/nim/rnimsyn.pas b/nim/rnimsyn.pas index 6b8e3b3cb..6cb78efcf 100644 --- a/nim/rnimsyn.pas +++ b/nim/rnimsyn.pas @@ -21,7 +21,7 @@ uses type TRenderFlag = (renderNone, renderNoBody, renderNoComments, - renderNoPragmas, renderIds); + renderDocComments, renderNoPragmas, renderIds); TRenderFlags = set of TRenderFlag; TRenderTok = record @@ -354,12 +354,20 @@ end; const Space = ' '+''; +function shouldRenderComment(var g: TSrcGen; n: PNode): bool; +begin + result := false; + if n.comment <> snil then + result := not (renderNoComments in g.flags) or + (renderDocComments in g.flags) and startsWith(n.comment, '##'); +end; + procedure gcom(var g: TSrcGen; n: PNode); var ml: int; begin assert(n <> nil); - if (n.comment <> snil) and not (renderNoComments in g.flags) then begin + if shouldRenderComment(g, n) then begin if (g.pendingNL < 0) and (length(g.buf) > 0) and (g.buf[length(g.buf)] <> ' ') then put(g, tkSpaces, Space); @@ -488,7 +496,7 @@ begin nkAddr: result := lsub(n.sons[0])+length('addr()'); nkHiddenAddr, nkHiddenDeref: result := lsub(n.sons[0]); nkCommand: result := lsub(n.sons[0])+lcomma(n, 1)+1; - nkExprEqExpr, nkDefaultTypeParam, nkAsgn: result := lsons(n)+3; + nkExprEqExpr, nkDefaultTypeParam, nkAsgn, nkFastAsgn: result := lsons(n)+3; nkPar, nkCurly, nkBracket: result := lcomma(n)+2; nkTupleTy: result := lcomma(n)+length('tuple[]'); nkQualified, nkDotExpr: result := lsons(n)+1; @@ -502,11 +510,12 @@ begin if n.sons[L-1] <> nil then result := result + lsub(n.sons[L-1]) + 3; end; + nkVarTuple: result := lcomma(n, 0, -3) + length('() = ') + lsub(lastSon(n)); nkChckRangeF: result := length('chckRangeF') + 2 + lcomma(n); nkChckRange64: result := length('chckRange64') + 2 + lcomma(n); nkChckRange: result := length('chckRange') + 2 + lcomma(n); - - nkObjDownConv, nkObjUpConv, + + nkObjDownConv, nkObjUpConv, nkStringToCString, nkCStringToString, nkPassAsOpenArray: begin result := 2; if sonsLen(n) >= 1 then @@ -981,7 +990,7 @@ begin put(g, tkSpaces, space); gcomma(g, n, 1); end; - nkExprEqExpr, nkDefaultTypeParam, nkAsgn: begin + nkExprEqExpr, nkDefaultTypeParam, nkAsgn, nkFastAsgn: begin gsub(g, n.sons[0]); put(g, tkSpaces, Space); putWithSpace(g, tkEquals, '='+''); @@ -997,7 +1006,7 @@ begin put(g, tkSymbol, 'chckRange64'); put(g, tkParLe, '('+''); gcomma(g, n); - put(g, tkParRi, ')'+''); + put(g, tkParRi, ')'+''); end; nkChckRange: begin put(g, tkSymbol, 'chckRange'); @@ -1005,13 +1014,13 @@ begin gcomma(g, n); put(g, tkParRi, ')'+''); end; - nkObjDownConv, nkObjUpConv, + nkObjDownConv, nkObjUpConv, nkStringToCString, nkCStringToString, nkPassAsOpenArray: begin if sonsLen(n) >= 1 then gsub(g, n.sons[0]); put(g, tkParLe, '('+''); gcomma(g, n, 1); - put(g, tkParRi, ')'+''); + put(g, tkParRi, ')'+''); end; nkPar: begin put(g, tkParLe, '('+''); @@ -1056,6 +1065,14 @@ begin gsub(g, n.sons[L-1], c) end; end; + nkVarTuple: begin + put(g, tkParLe, '('+''); + gcomma(g, n, 0, -3); + put(g, tkParRi, ')'+''); + put(g, tkSpaces, Space); + putWithSpace(g, tkEquals, '='+''); + gsub(g, lastSon(n), c); + end; nkExprColonExpr: begin gsub(g, n.sons[0]); putWithSpace(g, tkColon, ':'+''); @@ -1362,11 +1379,11 @@ begin nkTupleTy: begin put(g, tkTuple, 'tuple'); put(g, tkBracketLe, '['+''); - assert(n.sons[0].kind = nkIdentDefs); gcomma(g, n); put(g, tkBracketRi, ']'+''); end; else begin + //nkNone, nkMetaNode, nkTableConstr, nkExplicitTypeListCall: begin InternalError(n.info, 'rnimsyn.gsub(' +{&} nodeKindToStr[n.kind] +{&} ')') end end diff --git a/nim/rodwrite.pas b/nim/rodwrite.pas index 64f3d6733..637f69ff7 100644 --- a/nim/rodwrite.pas +++ b/nim/rodwrite.pas @@ -503,7 +503,7 @@ end; function process(c: PPassContext; n: PNode): PNode; var - i, j: int; + i: int; w: PRodWriter; a: PNode; s: PSym; diff --git a/nim/ropes.pas b/nim/ropes.pas index e82f1e96d..a6ba2a11b 100644 --- a/nim/ropes.pas +++ b/nim/ropes.pas @@ -14,7 +14,7 @@ unit ropes; efficiently; especially concatenation is done in O(1) instead of O(N). Ropes make use a lazy evaluation: They are essentially concatenation trees that are only flattened when converting to a native Nimrod - string or when written to disk. The empty string is represented with a + string or when written to disk. The empty string is represented by a nil pointer. A little picture makes everything clear: @@ -541,7 +541,6 @@ begin if (r.data <> snil) then begin if r.len > bufSize then // A token bigger than 1 KB? - This cannot happen in reality. - // Well, at least I hope so. 1 KB did happen! internalError('ropes: token too long'); readBytes := readBuffer(bin, buf, r.len); result := (readBytes = r.len) // BUGFIX diff --git a/nim/rst.pas b/nim/rst.pas index cc92e41eb..55c2c933a 100644 --- a/nim/rst.pas +++ b/nim/rst.pas @@ -494,7 +494,13 @@ begin if n.kind = rnLeaf then begin for i := strStart to length(n.text)+strStart-1 do begin case n.text[i] of - 'a'..'z', '0'..'9': begin + '0'..'9': begin + if b then begin addChar(r, '-'); b := false; end; + // BUGFIX: HTML id's cannot start with a digit + if length(r) = 0 then addChar(r, 'Z'); + addChar(r, n.text[i]) + end; + 'a'..'z': begin if b then begin addChar(r, '-'); b := false; end; addChar(r, n.text[i]) end; @@ -1235,7 +1241,7 @@ begin result := nil; if (p.tok[p.idx].kind = tkIndent) and (p.tok[p.idx+1].symbol = ':'+'') then begin - col := p.tok[p.idx].col; + col := p.tok[p.idx].ival; // BUGFIX! result := newRstNode(rnFieldList); inc(p.idx); while true do begin @@ -1252,10 +1258,10 @@ var i: int; f: PRstNode; begin - assert(n.kind = rnDirective); result := ''; if n.sons[1] = nil then exit; - assert(n.sons[1].kind = rnFieldList); + if (n.sons[1].kind <> rnFieldList) then + InternalError('getFieldValue (2): ' + rstnodeKindToStr[n.sons[1].kind]); for i := 0 to rsonsLen(n.sons[1])-1 do begin f := n.sons[1].sons[i]; if cmpIgnoreStyle(addNodes(f.sons[0]), fieldname) = 0 then begin diff --git a/nim/scanner.pas b/nim/scanner.pas index 83f5c12b0..a78f9c6ce 100644 --- a/nim/scanner.pas +++ b/nim/scanner.pas @@ -21,9 +21,8 @@ interface {$include 'config.inc'} uses - charsets, nsystem, sysutils, - hashes, options, msgs, strutils, platform, idents, - lexbase, llstream, wordrecg; + charsets, nsystem, sysutils, hashes, options, msgs, strutils, platform, + idents, lexbase, llstream, wordrecg; const MaxLineLength = 80; // lines longer than this lead to a warning @@ -31,7 +30,7 @@ const numChars: TCharSet = ['0'..'9','a'..'z','A'..'Z']; SymChars: TCharSet = ['a'..'z', 'A'..'Z', '0'..'9', #128..#255]; SymStartChars: TCharSet = ['a'..'z', 'A'..'Z', #128..#255]; - OpChars: TCharSet = ['+', '-', '*', '/', '<', '>', '!', '?', '^', '.', + OpChars: TCharSet = ['+', '-', '*', '/', '\', '<', '>', '!', '?', '^', '.', '|', '=', '%', '&', '$', '@', '~', #128..#255]; type @@ -162,6 +161,8 @@ var gLinesCompiled: int; // all lines that have been compiled procedure pushInd(var L: TLexer; indent: int); +procedure popInd(var L: TLexer); + function isKeyword(kind: TTokType): boolean; procedure openLexer(out lex: TLexer; const filename: string; @@ -206,6 +207,14 @@ begin //writeln('push indent ', indent); end; +procedure popInd(var L: TLexer); +var + len: int; +begin + len := length(L.indentStack); + setLength(L.indentStack, len-1); +end; + function findIdent(const L: TLexer; indent: int): boolean; var i: int; @@ -809,13 +818,11 @@ begin end; dec(L.dedent); tok.tokType := tkDed; - if i >= 0 then - setLength(L.indentStack, i+1) // pop indentations - else begin + if i < 0 then begin tok.tokType := tkSad; // for the parser it is better as SAD lexMessage(L, errInvalidIndentation); end - end; + end end; procedure scanComment(var L: TLexer; var tok: TToken); diff --git a/nim/sem.pas b/nim/sem.pas index 59bf29be5..6d97da3e8 100644 --- a/nim/sem.pas +++ b/nim/sem.pas @@ -76,6 +76,22 @@ function semStmt(c: PContext; n: PNode): PNode; forward; function semConstExpr(c: PContext; n: PNode): PNode; var e: PNode; +begin + e := semExprWithType(c, n); + if e = nil then begin + liMessage(n.info, errConstExprExpected); + result := nil; exit + end; + result := getConstExpr(c.module, e); + if result = nil then + liMessage(n.info, errConstExprExpected); +end; + +function semAndEvalConstExpr(c: PContext; n: PNode): PNode; +var + e: PNode; + p: PEvalContext; + s: PStackFrame; begin e := semExprWithType(c, n); if e = nil then begin @@ -85,7 +101,14 @@ begin result := getConstExpr(c.module, e); if result = nil then begin //writeln(output, renderTree(n)); - liMessage(n.info, errConstExprExpected); + p := newEvalContext(c.module, ''); + s := newStackFrame(); + s.call := e; + pushStackFrame(p, s); + result := eval(p, e); + popStackFrame(p); + if (result = nil) or (result.kind = nkEmpty) then + liMessage(n.info, errConstExprExpected); end end; diff --git a/nim/semdata.pas b/nim/semdata.pas index f920fae2a..9ffd41eac 100644 --- a/nim/semdata.pas +++ b/nim/semdata.pas @@ -43,6 +43,7 @@ type PContext = ^TContext; TContext = object(TPassContext) // a context represents a module module: PSym; // the module sym belonging to the context + filename: string; // the module's filename tab: TSymTab; // each module has its own symbol table AmbigiousSymbols: TIntSet; // contains ids of all ambigious symbols (cannot // store this info in the syms themselves!) @@ -160,6 +161,7 @@ begin result.module := module; result.generics := newNode(nkStmtList); {@emit result.converters := @[];} + result.filename := nimfile; end; procedure addConverter(c: PContext; conv: PSym); diff --git a/nim/semexprs.pas b/nim/semexprs.pas index 2c5672f7f..3e95e3457 100644 --- a/nim/semexprs.pas +++ b/nim/semexprs.pas @@ -36,9 +36,9 @@ var diff: int; begin diff := inheritanceDiff(castDest, src); - if diff = 0 then - liMessage(info, hintConvToBaseNotNeeded) - else if diff = high(int) then + //if diff = 0 then + // liMessage(info, hintConvToBaseNotNeeded) + if diff = high(int) then liMessage(info, errGenerated, format(MsgKindToString(errIllegalConvFromXtoY), [typeToString(src), typeToString(castDest)])); @@ -466,11 +466,11 @@ begin if m.state <> csMatch then begin msg := msgKindToString(errTypeMismatch); for i := 1 to sonsLen(n)-1 do begin - msg := msg +{&} typeToString(n.sons[i].typ); - if i <> sonsLen(n)-1 then msg := msg + ', '; + add(msg, typeToString(n.sons[i].typ)); + if i <> sonsLen(n)-1 then add(msg, ', '); end; - msg := msg +{&} ')' +{&} nl +{&} msgKindToString(errButExpected) +{&} - nl +{&} typeToString(n.sons[0].typ); + add(msg, ')' +{&} nl +{&} msgKindToString(errButExpected) +{&} + nl +{&} typeToString(n.sons[0].typ)); liMessage(n.Info, errGenerated, msg); result := nil end @@ -1117,7 +1117,7 @@ begin if s <> nil then result := semSym(c, n, s, flags) else - // test! + // this is a test comment; please don't touch it result := semFieldAccess(c, n, flags); end; diff --git a/nim/semfold.pas b/nim/semfold.pas index fa2e97635..422ddbd01 100644 --- a/nim/semfold.pas +++ b/nim/semfold.pas @@ -94,6 +94,25 @@ begin end end; +function enumValToString(a: PNode): string; +var + n: PNode; + field: PSym; + x: biggestInt; + i: int; +begin + x := getInt(a); + n := a.typ.n; + for i := 0 to sonsLen(n)-1 do begin + if n.sons[i].kind <> nkSym then InternalError(a.info, 'enumValToString'); + field := n.sons[i].sym; + if field.position = x then begin + result := field.name.s; exit + end; + end; + InternalError(a.info, 'no symbol for ordinal value: ' + toString(x)); +end; + function evalOp(m: TMagic; n, a, b: PNode): PNode; // if this is an unary operation, b is nil begin @@ -246,11 +265,18 @@ begin // available for interpretation. I don't know how to fix this. //result := newStrNodeT(renderTree(a, {@set}[renderNoComments]), n); end; - mIntToStr, mInt64ToStr, mBoolToStr, mCharToStr: + mIntToStr, mInt64ToStr: result := newStrNodeT(toString(getOrdValue(a)), n); + mBoolToStr: begin + if getOrdValue(a) = 0 then + result := newStrNodeT('false', n) + else + result := newStrNodeT('true', n) + end; mFloatToStr: result := newStrNodeT(toStringF(getFloat(a)), n); - mCStrToStr: result := newStrNodeT(getStrOrChar(a), n); + mCStrToStr, mCharToStr: result := newStrNodeT(getStrOrChar(a), n); mStrToStr: result := a; + mEnumToStr: result := newStrNodeT(enumValToString(a), n); mArrToSeq: begin result := copyTree(a); result.typ := n.typ; @@ -370,6 +396,10 @@ begin mNimrodMinor: result := newIntNodeT(VersionMinor, n); mNimrodPatch: result := newIntNodeT(VersionPatch, n); mCpuEndian: result := newIntNodeT(ord(CPU[targetCPU].endian), n); + mHostOS: + result := newStrNodeT(toLower(platform.OS[targetOS].name), n); + mHostCPU: + result := newStrNodeT(toLower(platform.CPU[targetCPU].name),n); mNaN: result := newFloatNodeT(NaN, n); mInf: result := newFloatNodeT(Inf, n); mNegInf: result := newFloatNodeT(NegInf, n); diff --git a/nim/semstmts.pas b/nim/semstmts.pas index 7d6403db4..098b95072 100644 --- a/nim/semstmts.pas +++ b/nim/semstmts.pas @@ -324,7 +324,7 @@ begin a := newNodeI(nkAsgn, n.sons[0].info); n.sons[0] := fitNode(c, restype, n.sons[0]); - // optimize away ``return result``, because it would be transferred + // optimize away ``return result``, because it would be transformed // to ``result = result; return``: if (n.sons[0].kind = nkSym) and (sfResult in n.sons[0].sym.flags) then begin @@ -378,14 +378,14 @@ function semVar(c: PContext; n: PNode): PNode; var i, j, len: int; a, b, def: PNode; - typ: PType; + typ, tup: PType; v: PSym; begin result := copyNode(n); for i := 0 to sonsLen(n)-1 do begin a := n.sons[i]; if a.kind = nkCommentStmt then continue; - if (a.kind <> nkIdentDefs) then IllFormedAst(a); + if (a.kind <> nkIdentDefs) and (a.kind <> nkVarTuple) then IllFormedAst(a); checkMinSonsLen(a, 3); len := sonsLen(a); if a.sons[len-2] <> nil then @@ -401,14 +401,21 @@ begin end else def := nil; + tup := skipGeneric(typ); + if a.kind = nkVarTuple then begin + if tup.kind <> tyTuple then liMessage(a.info, errXExpected, 'tuple'); + if len-2 <> sonsLen(tup) then + liMessage(a.info, errWrongNumberOfVariables); + end; for j := 0 to len-3 do begin - if (c.p.owner = nil) then begin + if c.p.owner = nil then begin v := semIdentWithPragma(c, skVar, a.sons[j], {@set}[sfStar, sfMinus]); include(v.flags, sfGlobal); end else v := semIdentWithPragma(c, skVar, a.sons[j], {@set}[]); - v.typ := typ; + if a.kind <> nkVarTuple then v.typ := typ + else v.typ := tup.sons[j]; if v.flags * [sfStar, sfMinus] <> {@set}[] then include(v.flags, sfInInterface); addInterfaceDecl(c, v); @@ -443,7 +450,7 @@ begin if a.sons[1] <> nil then typ := semTypeNode(c, a.sons[1], nil) else typ := nil; - def := semConstExpr(c, a.sons[2]); + def := semAndEvalConstExpr(c, a.sons[2]); // check type compability between def.typ and typ: if (typ <> nil) then begin def := fitRemoveHiddenConv(c, typ, def); @@ -495,7 +502,7 @@ begin iter := skipGeneric(n.sons[len-2].typ); openScope(c.tab); if iter.kind <> tyTuple then begin - if len <> 3 then liMessage(n.info, errWrongNumberOfLoopVariables); + if len <> 3 then liMessage(n.info, errWrongNumberOfVariables); v := newSymS(skForVar, n.sons[0], c); v.typ := iter; n.sons[0] := newSymNode(v); @@ -503,7 +510,7 @@ begin end else begin if len-2 <> sonsLen(iter) then - liMessage(n.info, errWrongNumberOfLoopVariables); + liMessage(n.info, errWrongNumberOfVariables); for i := 0 to len-3 do begin v := newSymS(skForVar, n.sons[i], c); v.typ := iter.sons[i]; @@ -840,6 +847,7 @@ begin closeScope(c.tab); // close scope for parameters popOwner(); c.p := oldP; // restore + result.typ := s.typ; end; function semProcAux(c: PContext; n: PNode; kind: TSymKind): PNode; diff --git a/nim/semtypes.pas b/nim/semtypes.pas index 5d9bd626a..37958c4d0 100644 --- a/nim/semtypes.pas +++ b/nim/semtypes.pas @@ -256,8 +256,8 @@ begin if templ = nil then begin result := nil; exit end; case templ.kind of nkSym: begin - if (templ.sym.kind = skTypeParam) - and (templ.sym.owner.id = sym.id) then + if (templ.sym.kind = skTypeParam) then + //and (templ.sym.owner.id = sym.id) then result := copyTree(actual.sons[templ.sym.position+1]) else result := copyNode(templ) @@ -285,15 +285,18 @@ begin result.containerID := s.typ.containerID; // ... but the same containerID result.sym := s; if (s.typ.containerID = 0) then - InternalError(n.info, 'semGeneric'); + InternalError(n.info, 'semtypes.semGeneric'); for i := 1 to sonsLen(n)-1 do begin elem := semTypeNode(c, n.sons[i], nil); - if elem.kind = tyGenericParam then result.kind := tyGeneric; + if elem.kind = tyGenericParam then + result.kind := tyGeneric; // prevend type from instantiation addSon(result, elem); end; if s.ast <> nil then begin - inst := instGenericAux(c, s.ast.sons[2], n, s); - if result.kind = tyGenericInst then begin + if (result.kind = tyGenericInst) then begin + inst := instGenericAux(c, s.ast.sons[2], n, s); + internalError(n.info, 'Generic containers not implemented'); + // XXX: implementation does not work this way // does checking of instantiated type for us: elem := semTypeNode(c, inst, nil); elem.id := result.containerID; @@ -303,7 +306,9 @@ begin addSon(result, nil); end else - liMessage(n.info, errCannotInstantiateX, s.name.s); + liMessage(n.info, errCannotInstantiateX, s.name.s); + (*if computeSize(result) < 0 then + liMessage(s.info, errIllegalRecursionInTypeX, s.name.s);*) end; function semIdentVis(c: PContext; kind: TSymKind; n: PNode; diff --git a/nim/sigmatch.pas b/nim/sigmatch.pas index 741052f05..289a17673 100644 --- a/nim/sigmatch.pas +++ b/nim/sigmatch.pas @@ -80,20 +80,23 @@ var begin result := msgKindToString(errTypeMismatch); for i := 1 to sonsLen(n)-1 do begin - result := result +{&} typeToString(n.sons[i].typ); - if i <> sonsLen(n)-1 then result := result + ', '; + debug(n.sons[i].typ); + add(result, typeToString(n.sons[i].typ)); + if i <> sonsLen(n)-1 then add(result, ', '); end; addChar(result, ')'); candidates := ''; sym := initOverloadIter(o, c, n.sons[0]); while sym <> nil do begin - if sym.kind in [skProc, skIterator, skConverter] then - candidates := candidates +{&} getProcHeader(sym) +{&} nl; + if sym.kind in [skProc, skIterator, skConverter] then begin + add(candidates, getProcHeader(sym)); + add(candidates, nl) + end; sym := nextOverloadIter(o, c, n.sons[0]); end; if candidates <> '' then - result := result +{&} nl +{&} msgKindToString(errButExpected) +{&} nl - +{&} candidates; + add(result, nl +{&} msgKindToString(errButExpected) +{&} nl + +{&} candidates); end; function typeRel(var mapping: TIdTable; f, a: PType): TTypeRelation; overload; @@ -431,7 +434,7 @@ begin // is a subtype of f? tyAnyEnum: begin case a.kind of tyRange: result := typeRel(mapping, f, base(a)); - tyEnum: result := isEqual; + tyEnum: result := isSubtype; else begin end end end; diff --git a/nim/strtabs.pas b/nim/strtabs.pas index 295c46faa..b07aefab1 100644 --- a/nim/strtabs.pas +++ b/nim/strtabs.pas @@ -8,8 +8,7 @@ // unit strtabs; -// A configuration file parser; the Nimrod version of this file -// will become part of the standard library. +// String tables. interface diff --git a/nim/strutils.pas b/nim/strutils.pas index 3d8f0424b..71a428dbb 100644 --- a/nim/strutils.pas +++ b/nim/strutils.pas @@ -75,13 +75,14 @@ const function strip(const s: string; const chars: TCharSet = WhiteSpace): string; function allCharsInSet(const s: string; const theSet: TCharSet): bool; -function quoteIfSpaceExists(const s: string): string; +function quoteIfContainsWhite(const s: string): string; implementation -function quoteIfSpaceExists(const s: string): string; +function quoteIfContainsWhite(const s: string): string; begin - if (findSubStr(' ', s) >= strStart) and (s[strStart] <> '"') then + if ((findSubStr(' ', s) >= strStart) + or (findSubStr(#9, s) >= strStart)) and (s[strStart] <> '"') then result := '"' +{&} s +{&} '"' else result := s diff --git a/nim/tigen.pas b/nim/tigen.pas new file mode 100644 index 000000000..937883e5e --- /dev/null +++ b/nim/tigen.pas @@ -0,0 +1,47 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// + +unit tigen; + +// Type information generator. It transforms types into the AST of walker +// procs. This is used by the code generators. + +interface + +{$include 'config.inc'} + +uses + nsystem, ast, astalgo, strutils, hashes, trees, treetab, platform, magicsys, + options, msgs, crc, idents, lists, types, rnimsyn; + +function gcWalker(t: PType): PNode; +function initWalker(t: PType): PNode; +function asgnWalker(t: PType): PNode; +function reprWalker(t: PType): PNode; + +implementation + +function gcWalker(t: PType): PNode; +begin +end; + +function initWalker(t: PType): PNode; +begin +end; + +function asgnWalker(t: PType): PNode; +begin +end; + +function reprWalker(t: PType): PNode; +begin +end; + +end. + diff --git a/nim/transf.pas b/nim/transf.pas index d74f2aa83..98d1e89ea 100644 --- a/nim/transf.pas +++ b/nim/transf.pas @@ -22,7 +22,7 @@ interface uses sysutils, nsystem, charsets, strutils, lists, options, ast, astalgo, trees, treetab, - msgs, nos, idents, rnimsyn, types, passes, semfold; + msgs, nos, idents, rnimsyn, types, passes, semfold, magicsys; const genPrefix = ':tmp'; // prefix for generated names @@ -139,7 +139,7 @@ More efficient, but not implementable: function newAsgnStmt(c: PTransf; le, ri: PNode): PNode; begin - result := newNodeI(nkAsgn, ri.info); + result := newNodeI(nkFastAsgn, ri.info); addSon(result, le); addSon(result, ri); end; @@ -224,6 +224,28 @@ begin end end; +function newTupleAccess(tup: PNode; i: int): PNode; +var + lit: PNode; +begin + result := newNodeIT(nkBracketExpr, tup.info, tup.typ.sons[i]); + addSon(result, copyTree(tup)); + lit := newNodeIT(nkIntLit, tup.info, getSysType(tyInt)); + lit.intVal := i; + addSon(result, lit); +end; + +procedure unpackTuple(c: PTransf; n, father: PNode); +var + i: int; +begin + // XXX: BUG: what if `n` is an expression with side-effects? + for i := 0 to sonsLen(n)-1 do begin + addSon(father, newAsgnStmt(c, c.transCon.forStmt.sons[i], + transform(c, newTupleAccess(n, i)))); + end +end; + function transformYield(c: PTransf; n: PNode): PNode; var e: PNode; @@ -239,10 +261,8 @@ begin transform(c, copyTree(e.sons[i])))); end end - else begin - // XXX: tuple unpacking: - internalError(n.info, 'tuple unpacking is not implemented'); - end + else + unpackTuple(c, e, result); end else begin e := transform(c, copyTree(e)); @@ -523,7 +543,7 @@ end; (* # example: proc map(f: proc (x: int): int {.closure}, a: seq[int]): seq[int] = - result = [] + result = @[] for elem in a: add result, f(a) @@ -534,12 +554,12 @@ end; proc map(f: proc(x: int): int, closure: pointer, a: seq[int]): seq[int] = - result = [] + result = @[] for elem in a: add result, f(a, closure) type - PMyClosure = ref record + PMyClosure = ref object y: var int proc myLambda(x: int, closure: pointer) = diff --git a/nim/types.pas b/nim/types.pas index 0686a368f..25ad54b33 100644 --- a/nim/types.pas +++ b/nim/types.pas @@ -638,15 +638,15 @@ begin assert(sonsLen(t.n) = sonsLen(t)); for i := 0 to sonsLen(t.n)-1 do begin assert(t.n.sons[i].kind = nkSym); - result := result +{&} t.n.sons[i].sym.name.s +{&} ': ' - +{&} typeToString(t.sons[i]); - if i < sonsLen(t.n)-1 then result := result +{&} ', '; + add(result, t.n.sons[i].sym.name.s +{&} ': ' + +{&} typeToString(t.sons[i])); + if i < sonsLen(t.n)-1 then add(result, ', '); end end else begin for i := 0 to sonsLen(t)-1 do begin - result := result +{&} typeToString(t.sons[i]); - if i < sonsLen(t)-1 then result := result +{&} ', '; + add(result, typeToString(t.sons[i])); + if i < sonsLen(t)-1 then add(result, ', '); end end; addChar(result, ']') @@ -659,14 +659,14 @@ begin tyProc: begin result := 'proc ('; for i := 1 to sonsLen(t)-1 do begin - result := result +{&} typeToString(t.sons[i]); - if i < sonsLen(t)-1 then result := result +{&} ', '; + add(result, typeToString(t.sons[i])); + if i < sonsLen(t)-1 then add(result, ', '); end; addChar(result, ')'); if t.sons[0] <> nil then - result := result +{&} ': ' +{&} TypeToString(t.sons[0]); + add(result, ': ' +{&} TypeToString(t.sons[0])); if t.callConv <> ccDefault then - result := result +{&} '{.' +{&} CallingConvToStr[t.callConv] +{&} '.}'; + add(result, '{.' +{&} CallingConvToStr[t.callConv] +{&} '.}'); end; else begin result := typeToStr[t.kind] diff --git a/nim/wordrecg.pas b/nim/wordrecg.pas index 309b2f7c1..587005c2a 100644 --- a/nim/wordrecg.pas +++ b/nim/wordrecg.pas @@ -73,7 +73,7 @@ type wOverflowchecks, wNilchecks, wAssertions, wWarnings, wW, wHints, wOptimization, wSpeed, wSize, wNone, wPath, wP, wD, wU, wDebuginfo, wCompileonly, wNolinking, wForcebuild, - wF, wDeadelim, wSafecode, wCompileTime, + wF, wDeadCodeElim, wSafecode, wCompileTime, wGc, wRefc, wBoehm, wA, wOpt, wO, wApp, wConsole, wGui, wPassc, wT, wPassl, wL, wListcmd, wGendoc, wGenmapping, @@ -86,7 +86,7 @@ type // commands: wCompileToC, wCompileToCpp, wCompileToEcmaScript, wPretty, wDoc, wPas, - wGenDepend, wListDef, wCheck, wParse, wScan, wBoot, wDebugTrans, + wGenDepend, wListDef, wCheck, wParse, wScan, wBoot, wLazy, wRst2html, wI, // special for the preprocessor of configuration files: wWrite, wPutEnv, wPrependEnv, wAppendEnv, @@ -147,7 +147,7 @@ const 'overflowchecks', 'nilchecks', 'assertions', 'warnings', 'w'+'', 'hints', 'optimization', 'speed', 'size', 'none', 'path', 'p'+'', 'd'+'', 'u'+'', 'debuginfo', 'compileonly', 'nolinking', 'forcebuild', - 'f'+'', 'deadelim', 'safecode', 'compiletime', + 'f'+'', 'deadcodeelim', 'safecode', 'compiletime', 'gc', 'refc', 'boehm', 'a'+'', 'opt', 'o'+'', 'app', 'console', 'gui', 'passc', 't'+'', 'passl', 'l'+'', 'listcmd', 'gendoc', 'genmapping', @@ -160,7 +160,7 @@ const // commands: 'compiletoc', 'compiletocpp', 'compiletoecmascript', 'pretty', 'doc', 'pas', 'gendepend', 'listdef', 'check', 'parse', - 'scan', 'boot', 'debugtrans', 'rst2html', 'i'+'', + 'scan', 'boot', 'lazy', 'rst2html', 'i'+'', // special for the preprocessor of configuration files: 'write', 'putenv', 'prependenv', 'appendenv', diff --git a/readme.txt b/readme.txt index bfff6217b..963ce8b14 100644 --- a/readme.txt +++ b/readme.txt @@ -1,21 +1,21 @@ -=========================================================== - Nimrod Compiler -=========================================================== - -This is the **Nimrod Compiler**. Nimrod is a new statically typed, imperative -programming language, that supports procedural, functional, object oriented and -generic programming styles while remaining simple and efficient. A special -feature that Nimrod inherited from Lisp is that Nimrod's abstract syntax tree -(AST) is part of the specification - this allows a powerful macro system which -can be used to create domain specific languages. - -*Nimrod* is a compiled, garbage-collected systems programming language -which has an excellent productivity/performance ratio. Nimrod's design -focuses on the 3E: efficiency, expressiveness, elegance (in the order of -priority). - -See the file ``install.txt`` for installation instructions. See the file -``doc/intern.txt`` for the internal documentation for developers. - -Copyright (c) 2004-2008 Andreas Rumpf. -All rights reserved. +=========================================================== + Nimrod Compiler +=========================================================== + +This is the **Nimrod Compiler**. Nimrod is a new statically typed, imperative +programming language, that supports procedural, functional, object oriented and +generic programming styles while remaining simple and efficient. A special +feature that Nimrod inherited from Lisp is that Nimrod's abstract syntax tree +(AST) is part of the specification - this allows a powerful macro system which +can be used to create domain specific languages. + +*Nimrod* is a compiled, garbage-collected systems programming language +which has an excellent productivity/performance ratio. Nimrod's design +focuses on the 3E: efficiency, expressiveness, elegance (in the order of +priority). + +See the file ``install.txt`` for installation instructions. See the file +``doc/intern.txt`` for the internal documentation for developers. + +Copyright (c) 2004-2009 Andreas Rumpf. +All rights reserved. diff --git a/rod/nimrod.cfg b/rod/nimrod.cfg index 2d742e431..31abf7a2a 100644 --- a/rod/nimrod.cfg +++ b/rod/nimrod.cfg @@ -5,7 +5,7 @@ @if llvm_gcc or gcc: # GCC, LLVM and Visual C++ have a problem to optimize some modules. # This is really strange. - @if windows: + @if windows or macosX: cgen.speed = "-O0" @else: cgen.speed = "-O1 -fno-strict-aliasing" diff --git a/rod/readme.txt b/rod/readme.txt index dbd14d459..6ecc723fb 100644 --- a/rod/readme.txt +++ b/rod/readme.txt @@ -1,3 +1,3 @@ This directory contains the Nimrod version of Nimrod's source code. These files -are generated by the ``boot`` command of nimrodc. DO NOT MODIFY THE FILES HERE! +are generated by the ``boot`` command of nimrod. DO NOT MODIFY THE FILES HERE! Modify the Pascal version. diff --git a/tests/gtk/ex9.nim b/tests/gtk/ex9.nim index 79b335044..ce2f73862 100644 --- a/tests/gtk/ex9.nim +++ b/tests/gtk/ex9.nim @@ -25,9 +25,9 @@ stackbox = gtk_vbox_new(TRUE, 10) button1 = gtk_button_new_with_label("Move mouse over button") buttonstyle = gtk_style_copy(gtk_widget_get_style(Button1)) ButtonStyle.bg[GTK_STATE_PRELIGHT].pixel = 0 -ButtonStyle.bg[GTK_STATE_PRELIGHT].red = 0x0000FFFF -ButtonStyle.bg[GTK_STATE_PRELIGHT].blue = 0 -ButtonStyle.bg[GTK_STATE_PRELIGHT].green = 0 +ButtonStyle.bg[GTK_STATE_PRELIGHT].red = 0x0000FFFF'i16 +ButtonStyle.bg[GTK_STATE_PRELIGHT].blue = 0'i16 +ButtonStyle.bg[GTK_STATE_PRELIGHT].green = 0'i16 gtk_widget_set_style(button1, buttonstyle) button2 = gtk_button_new() ALabel = gtk_label_new(Outside) diff --git a/tests/readme.txt b/tests/readme.txt index c8704f304..c21b04acd 100644 --- a/tests/readme.txt +++ b/tests/readme.txt @@ -1,7 +1,3 @@ -Note: Most test cases are not up to date to the current Nimrod -version. Only ``thallo`` is frequently tested! The best test is -to bootstrap, anyway. - This directory contains the test cases. Each test must have a filename of the form: ``t*.nim`` diff --git a/tests/thallo.nim b/tests/thallo.nim index 47d56724b..f8d3b8a69 100644 --- a/tests/thallo.nim +++ b/tests/thallo.nim @@ -1,7 +1,11 @@ # Hallo import - os + os, strutils, macros + +type + TMyEnum = enum + meA, meB, meC, meD when isMainModule: {.hint: "this is the main file".} @@ -9,7 +13,7 @@ when isMainModule: proc fac[T](x: T): T = # test recursive generic procs if x <= 1: return 1 - else: return x * fac(x-1) + else: return x.`*`(fac(x-1)) macro macrotest(n: expr): stmt = expectKind(n, nnkCall) @@ -35,22 +39,41 @@ echo("This was compiled by Nimrod version " & system.nimrodVersion) writeln(stdout, "Hallo", " World", "!") echo(["a", "b", "c", "d"].len) -for x in items(["What's", "your", "name", "?"]): +for x in items(["What's", "your", "name", "?", ]): echo(x = x) var `name` = readLine(stdin) {.breakpoint.} echo("Hi " & thallo.name & "!\n") debug(name) -var testseq: seq[string] = @[ "a", "b", "c", "d", "e"] +var testseq: seq[string] = @[ + "a", "b", "c", "d", "e" +] echo(repr(testseq)) var dummy = "hallo" echo(copy(dummy, 2, 3)) +echo($meC) + +# test tuples: +for x, y in items([(1, 2), (3, 4), (6, 1), (5, 2)]): + echo x + echo y + +# test constant evaluation: +const + constEval = "abc".contains('b') + constEval2 = fac(7) + +echo(constEval) +echo(constEval2) +echo(1.`+`(2)) + for i in 2..6: for j in countdown(i+4, 2): echo(fac(i * j)) when isMainModule: {.hint: "this is the main file".} + diff --git a/tests/titer.nim b/tests/titer.nim index 3f71ba8d9..19a11dc4e 100644 --- a/tests/titer.nim +++ b/tests/titer.nim @@ -32,3 +32,13 @@ for i in xrange(0, 5): for j in interval(45, 45): write(stdout, "test2!") write(stdout, "test3?") + +for x in items(["hi", "what's", "your", "name"]): + echo(x) + +const + stringArray = ["hi", "what's", "your", "name"] + +for i in 0..len(stringArray)-1: + echo(stringArray[i]) + diff --git a/tests/tlibs.nim b/tests/tlibs.nim index 317430744..2326fba64 100644 --- a/tests/tlibs.nim +++ b/tests/tlibs.nim @@ -1,9 +1,10 @@ # Test wether the bindings at least compile... import + unicode, osproc, zipfiles, sdl, smpeg, sdl_gfx, sdl_net, sdl_mixer, sdl_ttf, - sdl_image, sdl_mixer_nosmpeg + sdl_image, sdl_mixer_nosmpeg, cursorfont, xatom, xf86vmode, xkb, xrandr, xshm, xvlib, keysym, xcms, xi, xkblib, xrender, xutil, x, xf86dga, xinerama, xlib, xresource, xv, gtk2, glib2, pango, gdk2, diff --git a/tests/tnew.nim b/tests/tnew.nim index 813bb9433..6527541a2 100644 --- a/tests/tnew.nim +++ b/tests/tnew.nim @@ -31,7 +31,7 @@ proc main() = n = newNode(i, nil, newNode(i + 10000, nil, nil)) inc(i) - #new(p) + new(p) write(stdout, "Simple tree node allocation worked!\n") i = 0 diff --git a/todo.txt b/todo.txt index 2cd30ceea..44050d637 100644 --- a/todo.txt +++ b/todo.txt @@ -10,8 +10,7 @@ Bugs ---- - BUG: addr/deref may not work when interpreting -- BUG: the parser allows empty statements/object case branches -- BUG: the parser allows to omit commas +- BUG: the parser allows empty object case branches - BUG: when optmizing cgen.c with Visual C++, GCC, LLVM (O3), it breaks. - BUG: ``-cc:bcc`` command line option does not error - BUG: symbol files still do not work @@ -22,12 +21,16 @@ Bugs High priority ------------- -- documentation: var types, ``[]`` overloading, ``cast`` and type convertions, - ``if`` expresssions, (anonymous) procs +- implement tuple unpacking +- implement closures for the C code generator +- implement a better memory manager +- implement stack walking via assembler for horribly advanced optimizers + +- documentation: ``[]`` overloading, type convertions, + anonymous procs, ``len(s) == s.len``, type converters - implement two-phase lookup for generics (this is hard...): This is useful for macros too! Alternative: Explicit early name binding. Both are hard to implement -- implement closures for the C code generator - get rid of ``nkHiddenStdConv`` in several places: this mechanism caused more bugs than it ever solved! @@ -35,7 +38,6 @@ High priority Library ------- - xml, html, url, fastcgi: implement from scratch -- unicode library - socket library (does SDL for us?) - osproc for Windows - bignums @@ -47,7 +49,6 @@ Low priority - use `` notation for identifier concatenation? - Visual C++: emit ``default: __assume(0);`` for optimization -- ``nkTempAsgn``-node as optimization - macros: ``typecheck`` pragma; this is really a good idea! This allows transformations based on types! - make callconv a set @@ -326,7 +327,7 @@ Changelog - BUGFIX: ``genTypeSection`` uses ``isPureObject`` now - BUGFIX: ``GetUniqueType`` was wrong - BUGFIX: count references from untraced heap to traced heap! -- BUGFIX: fixed owner handling bug; only accessible in semantic checking phase +- BUGFIX: fixed owner handling bug; only accessible in semantic checking phase - BUGFIX: ``ParamTypesMatch`` generics resulting in openarray now generate the nkHiddenStdConv tree - BUGFIX: dynamic libraries are reused again -> much smaller C code is produced @@ -342,13 +343,38 @@ Changelog correctly 0.7.2 - small performance improvements for the RST parser +0.7.3 +- (assembler code for GCC, not activated) +- BUGFIX: docgen: take care of nkCommentStmt in sections +- docgen: only documentation comments are rendered +- BUGFIX: rst: getFieldValue(): invalid assertion +- BUGFIX: rst: parseFields(): more than one field is now correctly parsed +- BUGFIX: docgen: renderImage(): strip the arguments +- BUGFIX: ``\`` is allowed for operators like the spec says +- system: added ``hostOS`` and ``hostCPU`` magics +- system: echo now accepts multiple arguments +- added ``nkFastAsgn`` optimization +- BUGFIX: in rare cases, the index check has been optimized away, even though + it would have been necessary +- added dead code elimination +- COMP: renamed ``in_Operator`` to ``contains`` +- COMP: renamed ``quoteIfSpaceExists`` to ``quoteIfContainsWhite`` +- added ``EnumToStr`` magic +0.7.4 +- the parser is now much more picky +- for the closing parenthesis ``SAD`` token may occur +- the parser is now responsible for popping from the indendation stack +- constant evaluation in ``const`` sections +- removed hintConvToBaseNotNeeded: It is often intended for overloading + resolutions +- ``macros`` are no longer part of the ``system`` module, to use macros you + have to import the ``macros`` module For the next versions ===================== - multi-processor support -- tuple assignment - IDE - better support for GDB? - support for generation of dynamic libraries @@ -364,7 +390,6 @@ Further ideas/nice to have - CLR code generator; better use XYZ? --> Version 1.2? - provide an interactive shell: if the user wants his commands to be executed, the command should end with # -- add the built-in 'finalize' - implement packed arrays (bit arrays)/ packed records - implement tables (implement as library? - no! Builtin because of constructor syntax is nice to have) diff --git a/tools/niminst b/tools/niminst index 1eb39a5b6d8f583e9739e35226897cc43e2af908..4f007f577e7641e8764ea9414739819f3403629c 100644 GIT binary patch literal 311984 zcmdSCcYK`1@jrgD{eUqTiDED<2#kq=U_`gE4TsIa(M2(sY8e-7+=ML|Q3PjX1s#X5 zfcS$TBsscLNEBLx6Upa-CHhf96hq)>$sUFvS`eZ5_kPdpKKGogOGrMS-yh%8>$JNw zv$M0av%9n9dG5N%DaQ{eDhj#JfY8w)rpopT3rPQmLg76INt*w{p)sMY@PA}z@6Z-V zdjcbdxNu(BYgxN+uwX->fe6WQ%m4+984#9;3wKv=$c0WqhAc1l3EQZKcMVoKT^I_L z3ZD5WYwu9S_YR#Qa2I~2;84k_0>-~miBLS|E8SKJO1IT~E=-XzJ}z|iBQ?Kg+xne7 zAdD2#VFs3aE>!NJQ2BdRGZ+s)LJcvTlo#%}og_mpbotIeKFaxBKTggwZFzQW=&6{!Hyg3W1YYwa#bHss195#CK!qJCFy-OenX-_z9vWVpL=*nfS zDg+aP#p&lr1gGPBEWXTp9=@aT9f$8(_+E%FKYQVO5x!HIz-J1+5q$T-m+H9yU-vl^ zk*)9@kMB@?hvR!PzCXZMB@2Zp%lY`0;~T}d4Bw;hrJW7L_Z)orIYxuf2!vy8oc4Jr zzN7Fx(ZbHQ;Wh}*!1s83X;$0gyC1%%;ky&Q{G5yLM0}59;(zfO@^A7wy*sk45!nsj z9q_eHEbZp-{e`6#`29Y}Es@>@-(B(DKY-iW#t*mQK{h-X;T|^5pcvnM@tuJ0j`#*Y z&ZffvUX1TZeD}on5PaQdZ$u8jcUyc9!}k(!M~Xe_eo2 zLjm}&k*7a>-cmph9BcZcf2jcc&jreTwgCNa3zU0E0r<%U_#a&W{!Rft`xl^JR6x#H z0r-ppe8L6F{bK?6MTPhjD0giEKHC<6Z!7@knB8Cd?oojL;{tL%Qh?9z3&77Uz-L*3 zayJy<(@+5Z&jS2g3h-|)K)<#Cyr=-5j|<3iM*;fD1>m0+fbUcQenkN}69woGE268s|(OyQULy90X~@m@I?jSKPI46)TWep0s4@nKLh)v$$&JqDk|nEnYlxF{!U2@xh_1B8wI+TojtVX!@atgl5c~ zHE&wg%o7*PsXAn;OGOsUaM9451wufOjapip3eA`|ecr;wGZ8MVoVftO;w$H~wCODE zh|uDyMbj&<49%>WQx#e?bJ~mWQaMt*ow^9-1XtLAqf2{7Pn7 zG<`NCBwy0cs+u`(UTE>0OBYO=7n;gyPMotCLuINLND6!w&#VevI&a}6D1PRmMGF>AMKRN=<}6$gnzeZ5Ot3;x;52RVbYV4p z-ppx>Kp2|0aKWXQ0WlQ}7%r}wv9P)-Gz-;UESaF2S*k#kS+%el_0ft{&!4tNhGt!{XinA4&@46)crKU*eXxr2q&hR^%$g;US+?co&(-7% zX}HT5Q`@NFl1r**u~s4yMVA^=5iq!^Q)v~}Nas(R1Jx-)G`LXIi}GiN7B8@+K;Y>M z7r;)Y)}YO+5YE!b38$PmanjU7MjtZz@Q{li=Et}?93X!#WXi?auN0euxwO)4j_0a$ zpr301)@{KYo5wxD=lD2!7jB*-A3_<6KdZ_}E8fS*58tm6{bTwKTbA3H8_Ezb3q`?zt8aIVe#Pl@v3 zniNBr{}~*BTag7<5`aTA|1&%QALK(rq0#`HWxLO)0Nkxvi7N}hDU^=aIVwcCmDddJrv?v0&utQKzM5a&b=S^X$!!)ci}#%0G#_7 z?$Z^3a}DY~=>R;q5zrlg@8O6MW&&`x=RmXxz`4KSK0N_=sRJVH4Z!ybz(d>R?0@e7 zd~g6hA^%?b8(;20DNBuL^vt{|9${o7J!cmz{dpO+!J%3Z~z|MONs{I z-0N|l@&Nn?4v26{03O^6stCYG2k2)9;BKFa=*j@REI?lqfO9{~ePRLlAr6SJApqx$ z;66fX@!VPYb{+190xmyH8C3UhaShV*&UX0eC|Ier5pP6o8)ole;9UXu`2l!30KXsrkJf!K*n9;K z!Q2RUz|0&qFchs@H+b!)!>{^mL}=52hSllHQwXx*FLsN$<)uU5sq0q_=09u0^&)(nFZ0OP38vdH~bh^3V2s z3&6;Keu^|*j%-HKpD;~VBb%1=`%Kft$fhLyHq&$=vaOQdz%*TlY*NxMF-?~t+a&3y znWn3djY)b9({vHCm6Be`G+l#ig`^*5nl3@MT++W_nyx@LEa`igrVEfQlk}ZTbL!8Q zO8Qo&Ipt?dBz+^(oa(b7Nng)2r}%8oH?03vOqVj9k@O;_Ii+XQlD>>-PUYE@q%UEb zQ+T#j(&sbHsXLpL^qEX^%FZ@P`Xr_~RcB+8p2#$(=xn8=k7AlrbGAa#hcL}4Ia@C2 z{h8)eoDEBQZ>Bi~XUinLE7P2Mv!#;Wo@q|G*%C<)VVYBIHYDi*Omm9O_Ixev{|VBZ zTC*8Rf5J4U)NESP?=#J*G@Fw2+e~u`&9+K<1Jj&3vq?$6#5AYOY?Gv)W|~uFHYVvc zOmm9NR!Vv$)0`T!6_S3KX-dK}ieHqi7va%^jU&1t}s%)#I&u5xb zR5mH;GnwYplx>pqNlbG}%Elx;k!emv*-A+t#Wbg&Y=xu`VVYAIrL}CCH)JgIpk-g}P*1g+Pe)fr-sgg;PLeb9Er4n>b ziG@Sv22}L3rY6n-(S -$#U^^{J`>o6<4`GzCACqw)97B4KPo0}2XNpWIf0D+bZT zuFJaVtnmW$8LIu^U_mm zo0=#aL<>jbwO!H9NcWh_QPYHX%OU$9cO(svIh~-+NJjWH0v7ic5#1T-5fD%u8ls6v z*ZS~aA?45zO-y+CpnXCeq%jxH9RPmoNfWJ0l|d9-Dueb&-)m;&t= zqg~x%d9-6lo3ykX!a)0sPkVMAEwtWgsw^#sw^iZeCWXw$#}4cEg45|CA%j`mbPTy4%M1+ zP*<|6gJeCH>`#`AW4#!7tQ#275r=yP{n>#y;wxx_1BC%vH30w2h&O?>UBJs&{#THH z!rL2$7fk@|4M*&$wbCn>eoz7zF&c00g-;RftRIY#beeY0Phe2dcs-phAciBjS~_Vx z-7yq~p+k{zual&m_4L~W(HZI0P-rQcR{xsQsPjlKXvt(CnI!6^=tLXaz#KM*(nO38 zj)^@aO8Npq(V{gum{bEIHD4WW8#7T27yxgOz>VP; z<^v``H`;HlFoxzxHz?BqiXIq4AJE4HB|wR$8y86z-%R7Ort^v5CZ`>K?3zWMxeJG1 z0020-8#BOwXkySB6qT`g=(|JEjCo-eBJoH{61UEgL>n>!P=Wwa*fwpTrp!DyPHNfJ zkvv|M-DSSOnkSm5X6`QYJ`x=%hk9L6U;xw$M1@YUxmF7bGn3U``(eKJ0E70DB+!2G zsZ_2u-2n>>neP#SX;PLsP*JODEz+W)^rYcZHEYLVOlOf6P$mNuR=+`z)o+XHH`$+l zlTe4?MZe?E7ySY_xh0_ARx38wI;cvkSvXT9Zj!_yvnA00P5@B9i01S=|0vNzv(s<0 zxt+sSqMEszWzp;O+ib2;6c_-t5DBN>W;0Dtk!Gjgiw^bm3mEhpCPAKlld9hiPXtU_ z{fa)hEMu+?^nj4r&hqLAYistJPnk!VafN10yZG^#K`F~p#r4+{ssvoJ`L=I|Gt|H4 z2j+4duA`}99TmzqW`0b*ZbWp0OUx_-xFhL^mIzTK=Bl~~cYDC57fJ&RRh;!sD!H{V+ z$y6bG7ZB$TqZ3##PXN;q4v@AeDUnX# zyUTq2DHsATC7J4PKM@DU`8PyNl_l(v1s#-5$l1Y?-O|7@!zq28g-W zPZ5c10E2D2ixXn|5mMs{);M;O)R=Me7Fi}9(@gCGdLE#TvQu(2?Lt#eq^s)V2l-W1 zFy#Lqm989QsGt)xtkD28nj;A3q9uqPOIp{B(4_Ht5}?Lo^67L?>XmUblaeJK(~Ru`;`NY@Sb*kOr4b1dN;8@?sQ}F$LL>ZL`|LE@ zZy)lN;pHFN5+z7a%GE*#)5{5n*O!x4tyL$pb}B?kxP%7@0ofJmb&^#?Si!1yD~6f< z^gu1QBO~&`Dq@27F5Jg?v1dvw(rZ20x(`aD@mdp&S7$Kw>8dd?*=DVsCpPs8Ibma^2~APut_65enDXr)P;glD5yI@r#RuQ8$oYb z7qdx%oFk-*+53rhVgYrx)FzU`Xj7LeicarB0jX$XCFjSkXk)pCZ2R#8qVcEAgb%6E zNah~R2Xay{yZF4w69>RMn#BMX_YOl$1wJdf^aI0e@%G``EHso(6?>?NEuOpW9`A|p zVg$$p0Tdbc-rk#45Nj6%R_z)JEykSCs?rOwvb=qwG@Su0O$GxkM5;9%Tzi`J2Pm?m z0;B|+7BvBq4tAt;7tN0yY08n-=14g&3s+9RrqYpyF0x$D%#m*6Na>%Lh$9U<((mU; zx!WvUJxFbKb)+#z`ZYElZMBYbqdUd)kN%QhYJNxIIFW*q4QInomy zSJA*7jQ;Mj+C3Oz7giUaq5|yY#3g|8WQ0#Vla6QIf?!( zvq&V3F@eoa&<29&UyqA)7cW0j9af)~h1Ce#jg~;l!b#wi-LVs<= z%YQ*1OBE}$iAXE-m$IO8DWf)}`Wwc|!~^=1LPdWMa!u`onF6@W^A`E%>2HwPq{Dej zM~~{E#q5VI#(uNk<7XHBwU|xVwd^RFE|%D0K1K?*(4rHCF&}>4*B@ZeUz!A+ktFKj zs>#jRRbg;2i;ouSBnX<7Akq{dli?|;+IGQ+a{a|Rg357NU3bQMtAjqzan%J`AA`Qhi zzmHb54P#fH4Jc9Y(g=I2C;(2zZmqxaY_@s0%iNJt)is;9E(SB}bo;<(6Zt5k^$Fy*;{Rruf(ivh8G4qyS-J-;pzl`+lAtv^aB7vIwJ&=JL9HWCD9xTx*Zzx?(O?s!z~P|J#+ZUv^zVJwQ)Kxy;uI8W%2;Dp3(890 zqg_zLfa=HuXa@=HV=9xV^$W!&;LXshFui*#yN;L?3uYUbCy$xk#hIea(%Ikl`V>6j%Q zvqt7gcyo4fPTf?AVKZ~-I{IEXlCeiCr3GEz_>0l~R!8IT5C4t-8_CcoJ`_~>t}*;y zv0mT*UHUv`HbugCpsw=r>IK;$m2FG-JoTFoUBVcjwUZUN6&?pO^m1SVmfp5q( zzDcb_ny6pdD~>jbxtSkfQ34%&K8(!mx+2nqA%o1CFlb_^&{b6TzD1$+kxc@pW{V%M zp94dOix0{k00dLPFrk|VAIj<-HTGTENYgaM*RYE`r+9d>k)}%kFMd3-Ntcp!?OfRv zRUK#}*KMznQ1P-XTt~S9p^$;a%g+L7b}&r~d}auLS=tpp9v;lSB3|(aDgz8dyKfq4 znkl5%(Y^GCK;&(iMw+UXIBhd^*|2Ge!u|9WNUx+1(!toOl0}$(e{&4X7P8ck*56?5 zD!%#WGWbQBt`x-NE{7buW{GExJ|4NaI>GL0@#Du0C>cMlYP)>E52|-3U(H_IrQPV_ zPtdgSNY}=Ph`UP5q&@QBuj%SOGW;yn5cxJ%`)#P|TojZq!5<=m1Hq2@p1HD}oR5F3a%Sg)j_7MdG>5)b9LDN2#*uEgV&+>sk&Q}ZNI46X z9ck^h8FL7ldReM^-;N#!DOJe0j*?k2U1rR-3Mt=M&HR^2Nxo6U*VH|Y&1*?Fln>5M zvCT4jbF#q!vV$$zoXyDw1;~b2vdciWDhz>42@W~3pXz#{X&%5GNn8v-MSIM0OoDQt zq?-|5mpG!GX2hrHmXMrF8rK0I`aWPhe6qAXmiCKJly(7VvoDD!6=|wuMwW169ZQI$ zI#OC@%7C2uySyXgAQ^>B?Fh{gxl-nNh0N_Jb&x+OX!uYIIG@!~ z;UGU$$inPyh_FK3!04b>aHKlsr4b>M!A8B@fFO1eu`$U!VOL_eKL&MLL?0U1#abt0 zek40+IZdRkCO*W|e%a%c+Ab(;Pfk>umB<}hH39$3)McU*E-AD_*VVR#uH4=wS0y2V zIiDvJAYi|SCfl^PZ4?KN`ygv{WIg9hvD4NZ$#Z|Fp+h>%SO0UCU|U?HCEDcFkQ@Ao z>Q-~;i>Tgh>dDJ+p$79NHtn<5Sg`bV$e}%3+ddH!LxF=*pQ;wQiPg;aaK}I4-L}1( z)#8ZxGg&yew=x!^6-Z~3wD8`_iA38W-cA6SQc(&9t8tN3^)A3F#D<_M$|gwyz+MdN zYP&+kKXPMF_13b~$N{Q$@+oZ&7PPT~(7i1m31xhQBNa)}I~%)3SbP(!{U%iP10AVC z(digNfcH0hYD&z4*Eem#4t`y2uS)R^rkZa!b0xgF+c`Z=LyS|9)s=sAJDB5D{IQS@ zTP-K4(hg<5cq9oC+w64Q3Q5sh0gHP(5^a~aR%vu8L?bqAEy7d=!w|-ekh1&FEGUve zzSaT6afw#E>@JYM?R~o{Va5)RD?v?r5Hrk zN4}vJTDJzk#kWB`A^W={Lp^*yK^PMf<^DQW`*o;l8`6^o^aB_l+Lu0Q>A#BAeif>s zJqu0o=+ER`IB65;6{a7CAtE(UY5zW1II&w zg1#<=L*Uf`0C}uwgZ@I%{h;X`pF|8GF5@Q%WPFi19-!=si(Y}&Aq+luOS;h{q0@xB@={U!xacZ?u+PThz; z8~0u(8oeH+3#u0)!=771RYw8b>%d6_pWzb;tV=qH}d{ zn#ug0^2-%10~4S!yavCpYbECI=`a0&9I@0Gg%-vTSIPh@jz?93a+M$kP=70qgH?hg zSOg_;!(3Ajd@yA7)Arm)3PB@`ind8;fPJ!NcgY15(pSGLLZJfc2m!F~B zo9s?0IxU7D)Zzsdxhp!Md~GO%RZ26@)D!k-4m7JXxbld7GU-*tD^kUer#qNwRTpf? z+|Q$Puu1o2b4DRHW6YVm$%Mq&tm#J72JPEz=9D86NAJ;Lp2fK#aUG^N>FRpG$8#Et z3zy4&GlxX6ZP5Eeq63h}zZ(({wXSDE1+m-h8{cJjiDW3E-P5q{;fsoC%igVndee)n zxtf&eeOU~t=_WGc++H0f2T97sA5hlpYgP^y1+;XOUd9o#w#B?lu6hlq#r#PUfR4b4 z5A)ldHluBSx=LWOx5$FZOAK}+%~Hhtp}E2zn&a?Aqw~&7N?Tk*~L-LIv+NH(-Ya3xXXxVh&QRkbO2r!6JQ&W^FNRWP2OU z6-n}<eTLpQwlNS;pN zdk6U@>P4DF8y5u1;LVr0PUH+GWOtIRuC@oBWDEyz7W(60<|bWDV6SZZPMZ7O3;wuC@MfmqeaLJ_plWpM99EE?D!QJ`g zudaJ*%Qnmjp_hB>GDTQQ4Ox|j!I%NO2#{#!jAKr!LT+&|M4R`3x+64KI%cnV5PL7& zVxl+IQR<+#Sm<+vh8^^33;iRZc7fb$W?JYS&_PFqqdnb1>j;fG=vWJ#PiWFXM_A~& zgr*#HsD&O&XvRUmz{Eg#4AR+F)wQ!s=rVDdA)V4V zaJ)sZU;bOBVKN;dOx4?QyxqFon4hiog?tG7a*eXGN0s-OKy@Y5YwokqZVb0M6S&zz z$H7s~nLv$&jwIA?)=Mn3nb44Hs#7dgwVjPx-w_GYkUwqK!Vk#K%~5l`^Bo3~gJfdYwZQJj zlb_!*9&g4|XTSanR8W#*{fB?cIt&9fuWVI^ZyUe`5WYMrzeK$c)-dvCcDoC3Xq|G#M2ny0>8YEra z<^-9fg3wWFHRn)}Z+SYY4Y&Hc39^O<=62{9f-P*QqNO9P#?oRIZKU~B9btK{0nc2o z*{)K^ldgAisf1Hca|-6DY*kK@wckyWF(Qe-rexb(FjU$GH=?y|noa$mgDPn@)sn{P zzHOVbw?w8UsHDkE8VQwb)H6-C&ARU<$ZvSoZbzKP26>dnSpzQ3*@7xQLnW8zc+;); z*S0MNcvc?o23qsxya$o@p*h}|Ill|zA-P)lS~yNicW8hHKnKm zA!aZRCbDHYsh*I=73*mo~Y(wV4h%}X}LTv^;4Y^z;e!g7!1uwsg91sw%?tu z%)`o@fw_>(2j!UOtubV=Wp+PSsxb!S_P(6l!Zp*5BHXuD-@iEhPgt%_w-)g#1aqAr z;h*L-)(kbj$19xC@MUCMK@HgJ#BaVrb=l=!tFGAeqVbc0(fECw-V@%6-Vq4E$4ell z3)o}N=2g{FxJ6jQa`B2CKUuNHS9CMgDaIDY+6xTMCWE+M7wVLrVOO*?bI8sWt(aNd z+mEE3k(ff;IVc8}vpcM!*xo6h3qK;)M?RuYMnG2U-`j)=sBPw<`tUDRGJ zw;$PXqMf=_RQAwUsFH#=-s0SW7o~CUtIlk#`(W5ZzwD28%a`J4Z7@8b99+9Z7&6DM zlht|JA~QtF4&Snc+$z#6m~fDV$0fKn-6$$GD^oriQ#ABn+qAM25oP72XoC z)lDwr@1PpAz#3@*Ue6QNzY8jyQ#8vu{1vFAuATn}UGYGoo)NCYr?_=E*}jJi*@p-C zLi`QsSnWrlsuIhQfb1z6^IO3XB-gLf)>1m{H zB+%eK>}x;$4CYgK;f%N9Y$vJzlUNW=TClU%yc@>wS9IY^hS-%t$I#w16WwOxB-`pe zL?j{^-98*@#tZ~k>^65~)OK3UB`>f?;L!(q#giq0$dM=jJ!{mb7~5p9{T^dW*Kv%! z;MfcEHe0dD3Nf)EAJYN$(@!`cV#^Zyu6C0(1u-BX&xpKNh{n#QfO7kPDXx|Q*O1Nn z=(jSSaQiZ89@GTH@k%{tO_lh zgql_NnCW9stez(EJrr8oGKsmWKdpg7Hs!oC00~+pY1)$H8 zLt~>9MX-#ntL{cE%-D7w&={(g2Q)aK5I**drW;hXNq1!P-k!A5 z6|#ZHhY0@lkus5XG(2m_z?nW z^}AEaSid^y2TLvM=+9T zo8|zKRWxrcxhh*lH$&0M;^kAglu}(-MYG{sz@|yr_!r$N8u#dPWrn4XL>fRGQ(_U! zmKoc;%oxgSC|JA3(M#!x0_?HXty!0AgV4%0kGf!nxkr7IYl`JaN;Ma$vzNOgh> zF!)L+td81vo6L-p?SlGB)P`);Ond2GipLXFryS4TxCc$kvXF;MY@T(@BZsx)*P8ca z#a&;cT$_~ZJ$<=~!i4K#d0YXnwRsivi@l5xsag}$+QZ8Yi}uWtZ)RVmSp zkFi=SvB`={XD11glY&)O2n~Xo2n0iUW6jp)5FG!5gRH<(Qh=_&&UuR3u^06fG)X`j zziGHAn-)fRjw znF!3qlxxU96eSK~rn=e|eT<_;{9jH|b+t_jYNF@+vdmjBWN|xST>4~(G;hHtI}&5G z;j%A526t6huA@0oP`;XXU#Rvfy}C9|E*Tdu=edimsrD^J$MrsW@Hsf?H{RwI8@hSL z{<$mdQ7*J&?)wkxhbsr2i#+qV@c0ihpN+>}5-PS@{2EhqC@QDVV8T+kLWET8zh>8i z1tUvM9a*;6yk>_|g#0Ee{XeML>$^}p|BIR(22WFNW}6FHL6v{Y&E;Rrg7W3Bkh1@G zEwj7wkoEa3TUl@RKd26$PZB?tt2g!`yJ{Oi@AE`%$ZCyr7Lxn-YVu#L6O-qzL-sJv z;6b|Dm=e7zM3GpwOgGUv0NDAgSt%Y>istN{y2o4wezxz7%0-!vZ;kiIRr>^?UStTq z1x7lCPSW=7gYIgnbTU)c$suN__~t8eQ<=?CN(JaX1L`w8CqPLqN?C^F$r6@nOaVKb3}aR0e&v5#V><*sBAotXrRhKzqN?3M z_`V03;<}&GDNEfz6^Dvt$yStk;XoM|Gt^k8EQBp#I$tf@=2_zywMNn)S64o%Z5l$6 z$?4uU4WVcn<}6?#NW{i1w$<;K+WE!xS%jkOFtsw*VVx z37)oMqLMrb*(x)~;=lzhmn55n?h_{3nKI|@58}A6u)=IF+1ts~oVy)w;(Zva{V-Hj z40ALDPE;WFNj`L&H#>nVaUhX=*J5I{xZ-8vIO#ApOnD2N+jj63vlGE}{fq=(Y+s;z zyg|hON%#1XauTt(!d8Lqs{A)Yj6WMmr;&x(c$tlUPfs^E%e2!3bQ+o8AuU5dc6Hy` zsJ+Xlizpod*&&;UW6S$7ha$lBpq+I^ha(lX@T#nV*gK~46rQ>v>bX`hE zK=x{#>6*biU~c?z9-0PS+9$MhQlQ|be8OEo*il+Z@4cNUyuT4#H^~E6=0&K!A@V`2 z_JdH>kyhwkm9x+$9wSrp0yYLMRvto02q%;H)uv4wodb@C;PCVW$}uzGS40!u$tZi(Vgz`b^qRR zaxam#w!x%-OV#E*DVI@wMUwnQwvHHNlO?qI^S-DKcOT?MPx^Rl^fZB`ER6RPOeHQI zgANDG@+z(Fm8d|-{LSAqk0kez(y^!2h{suiimkymk-JPg3UVh$s+`y}!dB3ATT`Er zBpwGu)p2L;*k3}EVS)}7P$WamHP-B6dOp&fQJl zsZ{@$ju*BWTkuiAf@5j=XsACfqU{+Va9bxC^Ot=z_r`rKdR#Dno93_1n8z#~dQB^f z#){M)6V%^NdA)027tIlAIZY5wGzQIrWXN2J-9~E&#mh!+g~C+}M+2+flI?$jme##e zI%=XC&y@%dbJyq0VfQd`2bQ8leNp~-9}9OEnx!4=_FWi+AakX;%hmZ%cfUFxYPavC zD6$A_-(B@{Zr^>DhR|I%QZ%6myM0H#{`OsFEfaX1o!_&i z5<1Vj&MqLkt7KnHA;8+zfs7klu&+S*C}HfuJU0UVMPy&9>Os49BvCTz7MCR%rln zjE!x1*#>Z1Y|LjHz;3ber-y^IiAW69>$AmHiFqc#bYfn~VHu`$w@8mo1EgBM>>DAI zE6Mtuv%wZ_8MzlPzlgRMv;@h7VWoyt*aOd(fxmSJuSt-+it^LHflAM4*GIl3rzyD% z<+&&|V4pQ3M-0s+X5PJ$msC~)ed0`x<8f8^P7b;%nm%_H+|waLefmsK?-wewXpWga zh9*nsP<4rAL|_(I9LPAFFWwex68m5)pGrG*qYR>?vY7+Vrs)>M0iC=E5qJP_7yEdc zqPOXTE?zc<%o^L1m`4Ins4Y(VMQkNPJSK%E^c`z+_k>*j>&;kieOgUlN~RC2k)he9 ziw~^z@SgRRuD`3P{jWt&~D2Y(dSjz4yz=0G9BM$P-`?3N@_6|5RmD=DkmEpZBJ)%U3sFOO`h z`gV9&)JJ);6PdNpUJOe7OvJrI8EwSLUKW0d@lJ-D_%>eE zU{1l#g1H;#D&~Vm#FpVS%- zn9g}1kA{eJKck-h`j=6teHL;9LC!1JXCWUX+T}`kWkT)!{3(HEPDewm%AADfF<(wX zwa8lTLvGX~#0;N*Q=09bRhlyaDSq6W2PU{8Q3=m_DNsMDCs#$x|1Uv>_~ZZtO9JoOJ@o1<(DA6wE0tr@iqVYp8usE@J;~MLu16w zBi*B_ppS%iFX^p{#t@XRqGd!|70L7HjWSIJCc?|^P!Wf7tVL!C?VC1rq6?!$Gh#I- zx?Vh{_(giP+0(u7V<+8Fx3gHx&PU&3iuqQbvmfZ!=SvtC;5p-~fE~A>$hHf#D%~JJ zRayb+vQ-H$V7r*VWp zXAmB{3|fh9En+5$h$g%-X^I3Ld7}~YJ8l@wh*edj`)X~*?MPPGB0qt`LG8MF<~W&+ zxM2bJbSRV@k9=Ln$M>bz5xc4fUEg%lEl7BeFuMrxbHschIC^x)Re&av6c*s}d;xl` zx-!?=4j^G-!bwk}RiM$3Ve^9@48uFzFZ}?Cxl1tk8IDq@!C)*!6WPk?Yf&@N|ATi$ z4d*qB;JZ@GQ5sjEUAJqU@1n)ZY7)N#LXhhyjgb@@td?juGC27_aE-o@*H9*egp z-UVk;Ufo)?EsAT)e`i(IL~@lZE+maxW>)juJTYwVXTXbaf5AG&EK$Sj*?18-T%(G% zJ28>8?FLJcQMN<_+oVwE2!U{3cpNlz=kJ0@ge<(@EXu`RnCB0PB>FXJC z7@1J=eR+!dOqth*{cVj@syC-1+5Cb39??7q>ydZ8_bw(3JV&P;I$hV7-vH%z`)2&c zn1OGI4lz!7&0xaai@`MJM!7!WEhCIWSoj0d;qt3@IYD(Pco%qqgg0FXfckfjN*`i{ zTPDI`+><`T|4?vm_A~lQ3GZvM3V^&%5c9jOnz4OT#PixVFOt-@jUfoyKpC6{Qpo=> z(Sf$>NxLB5zoNZbevm_m{ph^Xt%D0RuWzdN$fah6_v4yq9Ye4 zI@j0zaqjojW&WEYF7^vMTVmg7SmPCFnF#-@w?7{*rt81`uI__MjA+e}w`F&&-P2;V zkt9HEc0_BnwM(LQza$!yo`7Xu^9Jvk!U8x@R}oIL5-Xz~BSOqKB6RriOc)5^{13KeI9G65|?W)+mKyeuRCyXe2k@}UbH&Fvq^n9WgsYXV$5erW(d*FB(8WTgnL9C@e1?6dQ<%**evLVs8zHpW znba$YS-I40QVHJufwP!dE)~fT@guDW-mOvUCoNdr$0_egm+$4-UnI3c_+T~r`l|{? zZO*e@F7BPK9WD0?e4VD?KGbPbj3z-mk^-y#yscuQb5i$higZ}KF1Sdjg`8BFVK@72 zl0KGLwu!vqO_ExLC-H1Q*rq2+cFf&-I^hAFTh^jD6wEpjbA zKA9tK+X}7K6cQFTu(3pMZeXb;va=h}fg;zZoqLzMLgqHE)9g*cXLy^Dc92t1DyP6R{#SIO%?JY?LBt0al5xz7;T?5M7G<)!tLjVAr+@f#OJV@TA83f1xnYvQN z>H)i6vbzfDje9covNaC1(LGe!jC+4&>S|`>E9GkNP*)^%jqq`P&quO~r+V#s0!Pc; zdzd(`=|}E{aL7`dm*qBSPC5bl=Ed>^0;!wL&Y<2nj`Y`oUQOUuS#T=1FOteFrrcUg zwU2Bz8;DGJ_0p}-s@~Oz`9q6u&-ZA{Ure&X_IwP{xyEusN_u~1#~9JD)aFjK{_exI zXo5DsyWyNL$)mwE&9_2W)aZ5xv zL|`a>)Gc6khQ#Ruv{$s5^WH*vFr1Bh0qjgOJ(}o7K8PzDX>Dc$$Hs(r+GxGgff_S0$VrBMT&=6|^9^xZp6TY*mVL*d(} z)BK+2^?99UwDyr3R0_Y3G$4()Gs@^6=yX?amcO4)Hw4v9-AD%gbh5S{sa+;JLA{OV zR=EaPE3v@n<=bvb8{i%i6t>+uqWiJk+gUZf{}Z>dtzqK){a;xW&a*&>w+okyADy%H zDzP)+#%GT{e#6??F>Li_)t{I>{mwt({i@Q4oB?rBJ!CHXf(D1j@VQU@D?X;p)h$Q3 zgxA&Kl+YoufE8B43b8?prvTtEKckAcgGBL25}^JZ=BtQC6QESFJR7>s+$yh|R= zOf44sTC$C^pxtS9hQtEqRpC#LP~+>W*<(mlxQ~|-y?GyZnoZrKHEc0Yh`Xb+*S&d~ zO-Yh-#7vvcebZ;q>I5uX{%lXlR&Qb}*|6-skyBA*UwC zY37dE+|}!6NtaC|B}wrlDch4-DZ5Qq;7MNmLy$d z<9P<+r4Ju^q-hK_t6^We=0{-sAyH5?MB`J0F8oqwk5 zu|7`b;p$}KC42JpZJVi<-r;2*M~xwC+6vbULsWsukb%9o!rk190EpYd=~W_N_;yVJWNWXM|fr zbZ&&poTkOed0EF(7-WorY#3YRE$4g~Ko4+AOd7Sqep>H#@*sdhdz#~EzweT=hQ&EJ;lrKfn5NrRO%_q;{6<9JsD$cU|I4m*TX!1>9ZFQ1XLeJcADL- z;SZo#xZ>#hpqFt|fd2|W7mysi4vgO+TsdE+GVzwYX-hchDQ}M@$ z`6~8D$qQ7)uaKmS0~LpQRvJo zktKf=YTd@i9;R3sZH6jSXXmZkG7TRvH#S{^69n*Lm+o>U6)P1y$m(t#!Ol@Co}IUr z2o^c;q`&+sLhE*bSf#dZkNC!GNVfy&_}-XmzIVKJMDzuaodSRdMy{jA#8Tm z)tffC4H}Z}31a&8rr$ zn*w^wNEAqhyDPw$9SOku&wt~3!A8XL{Dm^mJL~DLSNmH}^1|-VgGA?YWiCQ#>%G=r zjX*8XNiLScCv5c)&Xw5;=2l$Bz)st$%o(^8bQOkWNHpD-=sd)7_ifyPlwD(wxndGj z>K(2ECBeR}oFLRu8n`i%#6-T63X~F1;85y7S{=7!_=(}9y&1oEb{w~)u(FA-S^dvF z4^Howj!y42e_1J(!$Hj{!|zI?$wkJqGPG)w`4-Heo!~yIJ9x@~RD`p`X9jj6Z z*_a^fGG?r+Z4O;|43h`x>&=$zSP{;!Xz#*)7{2?rtO&tT!;qV0Do>9+q`(vN7`Icwd zx+9yERZYqa#LdO%zz7aNFvMb7(j0;WCeD{~#e3}Q@v68vqnusHonZKra$4-%9NWLY z)U(4(*1EZ=UW$Z_HtfZe!BKVSFP!QJN-WS>E1XmLhN}JTpZ`m>uO&LSx#rZJ+8zb3 zO35@)-J<7C;s|=2zZ2IgSaE5VZHx+Y4SP$G-vQ&?jV6 z%3xH=bnK0mF!SY5fN$f#+_wc=(?^{tD6}D3NKY1r2|FC+{H;s)K>gmP7N?ERB^L0y zd~JNK+IWQog^lnrqBqxun<7%TYje1C#u{s?*{`H?z4;)gHNHCpDYrO83$l2A@J}-A zL7DC#t+Z;gXx0a8RdrlGVC$+w^8rJv_Ra?kk;AwE({1?3TO_3-IA>aZ84C@Won@Wr zJ5_x7DaBl?7B9P%9Yud)JSX{wT!qWFX};uWQ3p`T0|1pg08q&T0F^ud*oIpJ_dzf@ ze!7pEhCg$kTYgEkRBrdn%ct?7Sm-=^u&vgQRquWQZ z8}5VV+P1El6pALiyGT^nZfc3n*^OJ8rACPau-2*XNXh;A9jW~+kxuaq=;J79^WiMF zEXfe5A0ltL2_w{jkEBu)V4OymAz6>Hr*$PHo z{mep-5}j*EHypYS@4^g(BAte^Z|!VVUF zqRs5=rlY!A6O!{(&FnJ?OtWb|Y=vAs9dNI)P~mYE#(^xBv0O)`Pf*!h=%(2R?r}=G zOJdIY`A$AAH}JT?6mp2`Zw$v*M1`L`Zdjp8o6d}RFML(i$)k#3f$rg6_&SE9ospP8 zeMJi4sgQ3~DW)*fvswm{3<$fGPzX-b3Isu?6J%e=gN7a#=`Ozc?!kcR8_W2x1{95T zh`zJO4HDbFDC!1Wo*+}>-KV&|D3_H_bwHWjI$%ZQ0tZf&^7*V!laC`R%_CCF<}Z~T z2ZhzO^Z(T1WjA6c*CwtTr;)MO?WU1~iyP^-X=0zM3$k0_5toGKH^BB{Z;}0tS;ho^I8GLN<4c8N{!k%A%<%oV*7C(-b$9i!HMSBGsK)Bf)jlW^0a#J0b zoXZG*S1(Ior6g6nAg?}$3ni3sgm#8X1Q#lWy%TxAWT(YQf015(JCE*JFepQ&jug`0 z^|zB@oYLzvW_*in2cP!bzO)=3GNv73WWT2W=x-8{K*QQjk3Xvnf$=>C8Ieu3`DUK#ZzfBf@z;7~3yM13;ZL%Ry(#Ba<`b#K1 zb~PZ8)737FCMGo8?+ip>BA*+WiYO7?O2M4`TP-N z(^i_Er~a!xqLIUN*HM$W`VlC6rc&BLuUsiHJxXKG5+r8JK6bO3$JlU-EnGWo#S*+o zs1NL_B{iGD!u`;lzodLKx`X@Jja1tAcwuWhL*4;N1k- zeWepek^xOzs+zE`r0m9TltkldvOt8);gU6IvNvv!W@_HdWSdQ#_jBabP4qZhSVxk+ z$?6-a`h1@-(=@ddjAazQXy-yf4sw)>>E0MHNj+i0Yrl|ZDz7f0h4V~lb!fm2&A@lnd%6~ zCot6AxLQ#7TrIsJ&{DSabN$jQwDbm)ewCKquvzI1fzlha^mVOx%C417rA6tEr9T(> z3yhb#s9qng(|kt{w3sooe`i&yEEY&DoO@6tcS=y7ljXjacc2J|xyKu!VrKBJAbMQ> zyMjKb2s-!6)!F(-Gc;P*x&IT<{#3l#25?3-7fCI08g>V1pW$a}!8e1<*2A(Zu0VQ& z?1sxRWu|z!Y}8_;x9c))=c?Zi*kWPdXFuTfPEnm<54C#hHMe38bBh9Gtjc9f`Z~Wj zmoc|uI8QR-6$JPhX=KtRLys;Xdd*0!P7l#b$dk*5D!D+&q+TGj8_#yUtI#an*bfeH zXU!#r%BGoCo_qm}>Oi)R<~=Etblt6zQ}OJcMp z3T?vzcsS^^o|MDOgucKxs2<7bZospN2e{n-@77aurIkoP1m>jJWaO@WkO(gu$e|t8K&XYLj*oe zho(bq#f;M_+PMHBn+5(}fER&M5&r!4Fn+R3EZa1kJ-mcWt(n?o;QKs7M&o7|sLkwj zi&N}25<|gt>t;KHsk1%-dazOB_-m6Ww-ucG+wAKkIya`MabSFgr($Ah%4)I3l4Id!Smdw_2=TC8`ym zXb`)m=Q}C|oPWiMWVf=v>__y??r*LxgWSd9rS+OM4{3$_c?#ik7!U+P`TkaC6@NTF z^@sk7<8LwK3Fk_vuq803ZS9Pj=GSkD{xaFuIC9|kKbE`J{+`5KH-d{%3HKt2?a5~B zLH`Pz+U#iX`OW{b!CxhM^9FaLgX>+XkEKSDq~ElkW(qVdyP)=myr#Xbn$_#ute@l* z1=hA%f67yORV)3s0VPL8ex*-`2szkjHoKcC_o?#rwoZl1Y+TAhKV>1g&~0VD*65V^ zqQnBqtO$D2Uun;&C;U71;DrJMH>?p;`wPm+p3b zWQoH4^c76w7p&#D6|amblB+iSMRa0Tanv-oJ%(~n>l&q%UL!l6ur@(lDF`l20$plv zm@bS|fYO8fvt2EWww^<7ezwau3Z#^?Tge>xrdUe%##@QIO2wi3pJDpyKH_ofMK2DX ztb#@I^7 z^cgZg(T66WDLgQ7mh8u1=?`PAOO?o*4me;S@4tJ^0p70_%1+dde^A2N>PU&X#RWQk zIcyc47S1Lxqz}Dv5}MBok;tA)j3USxrk+c@1!Dv#g8~HAOZop_eWAf&*lCjbVc!`R z(*{+yM&kpZg@49TO={ZfLCoI9urD+?Srzpsl2~8KDoVAY7hKwi&K=OW=`hpJ3k@3m z!s;aEk0!b7-4|-1mjnv64o2+|te7kqm)`VI(6hY7PvM57wr0|b>CeIMDHHTtLe z5uubummz92`X#cJ>?9l>2kjV*{ut2;jh2D7L8C(fZPn=0$kwgV2N4bJEF880?I?|& z0ornnUJHU6jlR5WL@24zCJ=OK^i)K9H2O9;3?DAcjzKi6(R~n|tEjeY=Vi$;$HG_BEdz^qrJpMs!tS7FuyXjG#Q zfwoekCxM_@qemi|(&#!67>%9*XvuEE;oCasSEGwTP@&Oo5Hx6X7^1BjU4&@2Mh`+X zw7YQl4AD^lMI<#^4rrG~Cm`CR(G7?W-$R()j%Zk;XCpdWqi=yj zlSW4a+NRMTBbw1@DGDC^J>f7C(K3zRiEL9edID%;8odzF7L9&+J@l*5odE6CXdSYZ z?kUX5z$~iKMnEeyx&hE;jh>5WN~1plGo#Uu0WB#N4oi@2j7EP9f(nhsK+vGkp&)40 z=uv=nYxF@xLwkWk!m9v5w3Dkhrp`oaeRwb)HSj}aL@p`6H>}^*w#cOybmC1G(NEe(Jyms_g{jBR0f}tz!&O0 zq`+V}$TtYW7wQ?oY&CGbR|-jRvDn)Kp{>iWNgMZe1|*u8P=dfzAId?`8;p3B402w3 zHQES;uJ^VDkQ}x~$V#KMdCI{91RTCC2ZuwI!#@zeQaRj)D9 zTE$dqy}lChonk%|>8b2tZxfO5HcEk_n6w~8->boopY`6IQUcy9M!L@M@X+2;%7sgr zbZk#U%IbR(5eaWuj_tvM6t-lhY!_R$I|`rh@G@mPKNe&=6)DU1Y$6igdknN0Ckj&7 zl9{qS#j+hqI!IfgY+sd9Tq|{nK!dk~655Htb7$B2Y=0@pt!QFh!o<~arIaVC`wbBZ zZwdny<|l#_VRrI``RH^t)fnj@Op^-pu_T=^??_G&rkjX_cLoDxyIznY%p-*Q3cp_v zBFvpcB)lD16V272x!7->fC#FYTdgp2g->{RN`?81HTTW_uSh}R)XZx{B)st?SGG?H zQiR!-h55pSL}en(=PJw(bGfvBqL~YQVGg&#uzu7`j|y|0B%Nk1N6HE_i-?4GI|CJl z_OL!I!n~zbuwDOUtpY8)ORMlD1I_igAVru>r#a1ZBgW>wgLDw4bc9$q?JK95!=yaX z%zi{9yvuTIcg_j(?zNK33iB#b)_|WO0{uIe>j^=MF!%VvTy2H9OZbF`m#Z-KwLxL7 zK+0-n9uWy|KFPI?=L=Fav!&*;!hCs+FU;Q&MXonumUlD=lN^`mH6r>1~@P(OS zg{c)j;o%t-<{VL!6DBG;6=5b2f%j&RT!lG6kRps>VZJaML`u=j3q)WZ%n8#jND*eV zFU*!!m?Y`YOeOn>0beOeH+;>NoWiz(2)xgZfeLe)AcZZN>4=dzMHPN9>A*IuY;V1a zNms{ZNZHoEk_g=A%dx#wkWxp{t6#^TicUqC+o%$}&x;CDVU`L~g!u(TP+{tfp=DU;O@i%EOdK>)`|`#ZQR=i5ESYmFjr}z-<&ie z6xTxUnG5Gy3tcP~a(bF6^^uyMF9^S;Ckuu(O@j{$eGXx%HtT58#=TBJP-qH)@wCu3 z#8+schojIQE%Y4W?Fx+wYbkVsApAnf7qcr0O@I#zZ9q6m3*C;iI5!3agzSS`8;V*QSpkW!tnx5PqR|2!@3o4?Zk(62dYq^cvE}y$OJz&?69- z-L%lri2p(h-TK54AzT84*ZOXhU8&P60wk<{@h4i^@Q|wFUP*?c%6^5EE&bz0A`;$O z2HLA?1c_eN>HU1ph)_(c^)%f0T($my6sol|a{g8jezooq%vJ-|doMs3R_j@WwqMqh zHtwwl1l3xFz#NBHp@Qglh(D^;8b1dMDlPPn!rL`qr?4KpD+*=#7&F|`=^?>Tmp6hB z3%vnhSS#B^TDPt5n63bW#;b z*)l@?ql!g%M@oUR#&{PH>$i>7Tvn(9G#CB0QX&%GvAJB^3KAn!!W+SM=?ryiRfb8^ z3?2c*5JC7F_{wGJ^aeq2e%5<`k*XxTH^`bZ<@d!xub`Ozs53`I9E_#nu!~jx-{d4Y zMdgQLr-2t0doe=Wng@|Q?o9y%iai5?Su#=-dm`fPRBXbVNFtP-QQiGsL~**)b`#yv zZa}_+@D$y#-K_3b2oq<$Hy~wauxp4&c;75Wpw@etAZ2v_Pk?=kfep1~t1j%wA2P>-j5rlS(KTPPnhX6sj4u~e7%96T&l3k1<7(3fECM~i_i}9XOlec%>)GHUW~xp2I~UR zIfy@}Z z2+VF;?zV`(q~&g$f$>ty{kl@h#a1~>`8!f5cPm8S5rp4OUJ(qfBhm}nQ1%YVffLil z@_nQ6bhIcHE#hyZ4_Y7NRtsO**$0OM;MH#r5_tUjsO&me5_xuIn|)_Rfn@p zA~0NPbR3@6fo{+?`95->(IPy|v4zqmBar@BHM-wr7!H8}ZP-f?I$zX&z1O=wLlWgr z@S(l>&r-H+=OiWX6Kv*HK96wHC+GQmyqhA4=;CDTHNVT%pKK&KSd@oji`C-w@oNNwm5u=x=BP z{zHF5ifeJ-jE?j^d zG{F|80rPXW@J+Qckr}hTbp8d3pv2>8Xjh}VpxZ?o1XzgO4XiHA*^3nr$WF{ho6@M z&#x?#66$;j@Q~<_@w5Y5g0S)MJ;(vk8a(tjlbXVnNPnYjKXx%JV3f4A=+m>Gs1oG> zb3!)J!z@t@FowqC1{mBaS`y9jFupU(Df66}@tv81$jPOCuN3awnc;L34(sMPGyeLi zH^8JPL8fYa^ap2#ufyE{^J_@nQw)9~Qta`M;wiw0SFx2~e{ImmhVac8GpNzocn(Gt zDB?(M#%quRjb4t2nT6kH0MLa<_ntqI$>|qih#yT1X8|=aoPlSdVz}yRRE>vY$N`4& zc$k9~!|_P>Qw;k9Ly2HG37Nz&7Ee3K9i$kJLk=*E#>0Gw?1oA^RH{X4%3PxguaIl?c(oBA&0T>7Z8~LHiUnV6g|gF zgag_taE{kG_aYX+U-F@7Pm@CFy}g;+kzqK^EN8iCSne5F=Hy#$PMK%9Y2R`cL_RI;_e%2C ziQv%9vN}wS(y&}qb>%V)*MAS(d6rwRmYb&Krh9sp`xew32G1M9zY>Kvg`4mc;6!-V zRa6_|OGUK1tI^hMqnUVG7j_B(;^9){z-rFN!#oW)0id&xww8MylBJ}MbvlxyhU6lU z;Xka8EaB&-Bj-p`T7Vqd=WTdeS64GrD9u3*DBXaEnWU7iLVAGO=WW1H1PrKpK9Y5U z?8hi4vU~Bg$chzN963OC2Oj3Dy@jh=kha}rC@>@iLlrWKp%PE)1pjrVurn7qz`(w2 zRw#y9NDonV!bs}M_^*(gUg6((mZ&OPra>#p>)SSocm`^a(nLHhulHOjl*SJL%~%Lkw5fzPAZ z6azqn9PN&$ZS-5DO1Lj_z)?>;%nN&o_O?U3VJiDtV5kBHkoZDbu=0>DSm=*}ccs7^ zbzbx7UyIslp+6kxN&f&m`481@xdMda;eC}p88pW${eDQ>);kgy3XY}(dmxh-^6|71 z6f1_^kOK+2<6*uUC=z@F39PfbA4zS!*-QaLEuMvJy+n9_WqnYCiulMCz~s#-euOuO z$XVQ-EJ%buzmhDAmdm7&QJxHZC>i@0Pph111doT)$N^*T;$bdP#@<5OMtQEEis>js z1K#fw-Wyv-3Tjy>>@NkLYV)N;JX8y{=sZ*lJk*RVx8ZxJoHEZt;fR}CyeSAjxJdMS zrS#T`;N5wk4ju|HIAQ0Ni-#)O14{QiR7gEk3q4dzch5szItgwEJZ}gWBgJ-@il+c4 z!pB`s1w;mgj$uA8~la=en* z135+7)GrbPNEB*QPr8h+&XSJ98=9K?pog&l;~K%WsRv7;3?&-`i3`It;>~u$->@JN zp2Nyo>t|9Z-LU652Zl;TvWF(BWDnqJjrgB4SS7p|IgqRt4|CL>B3TX6qgArk&W0Nl z3<+dXH;eGJ);3azhVMWQFx-lVX=95ZK8y5milGh|l7e9#GKpaho>sdzC=aud0}NN= zVV+hDGmt((F`NesZNLCA-y=m&d2iv(DsKY|65+XmPx{GnDP%u65~xUb6rP1J1i;-- z@OXFxazOV0Jj`)QcQDf9mF~x90sdIp#ZY7t!w@`2D25fKf?+S@07E_=X4~!}dvByq zQ4CK3Ly2JMk4$3dgJ+RqxLGmuL=G_g&jeujonrVB>9ZBXO~6nk82*h+Vra*+STP)_ z7`{LbFtp-fW-A7+7cW!{#lX-Y7&6EthL7=#D25%1A&nehcoz>dN-?~J^p%R?4A?Yn zW<&T8q}YKb;hCH$Eph}k4(l$`2KpF_1vJnsMc;xqYp1WXAQApn2ucIJD1~CDhnK*n zjuU*Z6QIdi*c!Y60auI5rNHw@k4uTv{_B}oBx&v5mr8BBK>1q9bFJ`qlK0n|??el0Sw)k>9`45Wt=wc`$9)21* zXz^d-VaDc*-9Cb}opCKb19mGIrUErFoNb8$!x+Ud89BfZ#lw8VnIhsVNY7TAITXlr z@aw@83JdY9Qk%(GCL?IH4dLHKl*DiGj46}N1c-;9WKLq-V|bYRmBa%`S15@cQ-Bam zf~97%@g1vrYCVG34xvXQ^VCbfI7v zh#X+}9v-HLV(5kR9g5+PC%S>~DWu5ct9aIFv%hu$s**`~Becz}MCfhQ{{U~+Rb0jb z{GO^16jxCqg>1L*?We=Wz#{;DEJC~G)k3`4R-dQZ;3!47YotV4J;|)hW0D_D#%k;C zU^3Vme#3Vx_S!z_x4j3I06xrOB0Fz>z)VH$tmZGpVCXl0dV=)&B%42pb=El=f*uJa z>pH7DQq=5FJOwxrUPM(vvvnu1@z$b`u<=&oNk;({TqU{;HzEg(_Y5B9LWz>fG2^pTSDGYUJXO>sVp^$^JPXtiyPc1!P*+6l=nmmC)Q$~Zpf3}VBs6z53liad2(FAxlR_DF@?!9j zV?!a7nk zJ6059u!!;%vl(w_a{Qj@z&BZd-@_!hYIcn#3d&qFd-P;1YTm;h^MuxA1HUgkVqgrUR509yOk!AwXOUvKQZdX&4lvBc!wgXjHz2)MF^mOAtmOk%hR&tk=J zpklZVIlyow9%eJUR#W(5q+eAGTr(#H!{x{%hEhBuis5hPqG~*R0dj!h96ZcY#c(>( zZzzUlEaKXL0h+&2%p+8ywJ*mT%&afWY&r`P;U5V;8A(o-LUdsKzBhB5LJ{ruui(wr zTFC;O`(|Y|&Sg@_wZum-Cvy8fElueq2p$h_VNPP)+jy8y;i&=iI?{hsZij)}!V`tt z`=}pphFgO-&}BH|7Af$&#kEo*zUDeitg29ZL-gY&s>LO$k!})kFQy%WXIueRH2RXnn84ojF zF-$_*o|*pJ$N`2Cc$ig+p^(4}CQ>E)0YklDIGCBpIS|jJVt7e0?1vm+*b5JHt77;b z()|^~2XLV&!7u=s#IQS_&5Gd`#n2Zyz|a#9bG%~MjNFS*f{tbUoCm1#&lNdN36?cU5ql)2W*kc&3$y3ane9hi8xj48Ov|e2zIffF48oOvOMa+Xf8iXa%I` zO%zBUU7zceuc%Oed1~;=Q*l_HHn5kwi9!P=3cq5X4UXIXM4@A`H&JNtCkh@EKM2H( zwSMOl1;9*2?W~DHnp@W1L?KNdP#taHM4_RZH&M6>Du6m+K@p~)l#B5cV60PB;6YWW zyCHnFJ8$vhN=l!s-h=j6sS_PRFy5Qy=(6@&K<^$Z1|vv>tHGUde3v zezE~6_vPW%f>^w=9V%!KmG@bL$#uxg+h@lP{~mk$g(VijL{cvD=@sGy%yQqI>KB&h z32E=*p>`n+knal%yh<*T7t=c=4)fSKKvLcpmepImi&u-4XlUm||As&c_-M1lJfi0a z(Q$WU!L669PP{}u^2K?Yfq$WvdHjaAsYTQ03aDHfyK&KkLCl(}EaPT`2*(?d^gPKM zw~QDgNSoUi5hK3`h6?#TaFb!PKv9#)lxTZ`qyplVK;xLh>L~9Ma?32$ zYYK=$v0CKC!{3r!r)mU${(t?6?^%aJX^ddeYh``nySKCo&A&fV*`N3(R8iZYdnhUe z1jZ^VZ55S5y|-E1i7j;UiSMrnDlJqmsXz;rx)xeAm6tCxTRW^!+R{kY_=AmfzS359 z{QF^37l6O~=PI8v`{_mQ!OJ#M7osr0aOxty)5Y0KWAlF)SBTWbQX+R|H0aNIPr40? z6^laKr^pu2DuuSGzE-;R*=Xf$<+P;z(477AY6 zC3~gbQF0T)EvmO!k_zap5PHKwg7UN{k=_EFj{Sf8WrGXmQ_!5RxD(5mA;LzRak={-UVspNsk-u|Ze<7JZ}+le@HbRG5%toSsZx^Wx2IFj zxZeJ7W?$~I7oTCX`O}H%D_r)*$(kKYgpVf&VsN7+6;Rx4C~g_#sgK#86!^8u)JtWO z%K)rQNnoa1Xn?hUg3t%3i4oc>r;}F+Wx1?g}>oEmCr_<77R99oxF}68R%ktqP*(?`E`LVuRKT4yxRBUF4JXt!L8#Kl1u6}ww1tB3 zW67!re-u)@s7<>!?^BDp?gm`VFR0}G2p^9ok=4>kU;FG-kvt8;_>r5>MGHR=E})n( z_?6WMle|BJS!-C`oO6>po$CdtvQcjz-Bd}rUxxKJtj1h2WL{>*@h_wLqNv=zSdJ6x z@YKAI`3P36Zts!*Fbg5V-*K%dM4LfgM6_v0A^&q++7t6H?J4ZCSH$0nja(bUCD&BF zc9pi+kty$TNc}Nn{=Tf-Tz@p6vVN8TKLT^otzbCVH6ozqb&ZXx%ryx5fQC5DPP#@t zi#zEWH;S&xo7Z4f6*9}{PH;i4IGet_4C=sW5?C>u${BA}!MVhR;n163lzOJ!gx^C| zenu-lU72-(@}s`h=gWW#@|m2geAS~>mYGj^e-&>ZN$}p2NCDZP?>rD$aonE-c=3#? zUJpb(WRJO`JY<%j9xq!;>e<^w&w>~(VbR|Q00zAR#ocJALuQP#e@XD)%{(=yX zHozYxmE$YD=|-zIz|#ckx_8~nVt=~fW>jsq0a8`k01eVD1}JN7sF1py1@s{mr+cq@ z%@YQhfZFcHrHxP`H=b( zgkx0dzep-zc3G3Gf2q`s1nOGqpR(9WZM|u#CMfBlI)1l-^FT)gAD4Q3Ohw9fZt!iT zo^Rt_^YJP5pwJw?eIob{kJvdsa!#XTE2LyXkSK@M!YQ@#epGQEQ8b5WL#@9JxtwXF z?iLZ`r|lesm~JoJwh2j)SAYlSuR+@{JBW1?QrE+**4S=-qCr z2t1B^K&6ZBcLiILv*ZrMWM0r@-skP_NcZ!OpgE{zpM2G#giOxJ$ zBbDQk;EndyW_Xlf_A01O23a{L0N%hF&BJwu(t$q&EIM5Ki$aM?#{LV+Er3O@0)|x>&)oSofIbq6yPUKVK(sMZ*V*T?^_tr z@$RgATz|$Oo#}18o~)&vqvwU03DyU0yZCy5SF^hx7eibhZJ_>P6;fFSpdQiw{=*?^ z2ulgxwSSn$V!t(9gQo5meV4^EDMV=1(1K6=-jRF0YfL{0tgo#wejC*@3R`&~6ceJW@9KpI)?fxwG zRqOg#>QUif+*|}qRu4kjRN;3ZfCr5}@Bw5(;C5ZYrylc|#q79ZfAiFt0@=2@o*@(d z!uH7mQ4S5^<#+{ei`9zJ0t=o{=g%b{zvNj0#?4dbv1P&wgcJye%aQVgj0C4zm#CoU z64Xw$DwyS@(f|o#s>pJ-lU4zvNvM$i_wr^)l#EG(AX=ilArB&r?H-H2W?s*eev-D* zq6keV)w6!NjB!P6mGww@443L)G<6w%{AW4XXnsVQeuUs%w@wv{og6;%sV7vS%f#>( zVjyz%b}*o|)IHsBHH#OD!cS#>&$=l6C7u{Cm&>hpWqZ3U=?=%tRbZU~ECZy@0A9aX zo0h;&5)b=W*=U%T+x;Bym z7W;bsum2EV!&t}Z6G*9b@G@laSMgPP3GxbFg1l(Sb?SK+ty9j+Sv4N50((pCSXl=> zK%2;mhtFfN3px50(;^_yzkN2_XWg?%Xq$eG-`D`+G-}r^M=qYOR^1A|+pCaqV>v6E zyXE%@>}upbx_#b;c+Ye!Rfys_slvMr^#)}b0_TLy?zluA27r9I>sjuj9E%@+St~m# z(YoiQp1URRAR&T~N;Z;>*AR&V3S|MwEsKmJ)La40Rj=aTTNX^z#Ekq}-d?FM7x0%~ zSUf(z_Ag%U@Urh`-o_xPMflAa-VmO7*~_`LtR$hR?XS8lLs8}-08#80lzsb?E`OTt z>vW|PtUD5Bvi|x(OXhJ}I4Zv6ih(F(j?m&1OIAsVRe)7~e<`=h-;2Ne!HcLL!m?O@ zfujgRNh()sKf$jD1oA~uV=Lv?^t9GcpPc)dlwa^i3D8k8x2PG`vGJjLdwuTD_%j>! zrx`@9GJ(hR%Np@!^Ld5nfY+4QtwH7d=T?YG%l*}>XyfKR{Z$c+3tUCgpCTz9*Iad~ z)K1!~B9o>&VG}ZjB+Zu`>*;;1-6pe`Gw#a&@$?TMzfOzoh4Zg!vFP|^DaqFHlTvPV z{5#s1)3N zKgof-K-apoj6cbdmA5cCuV0h=f)s77wU4HeMB7NVjlA%OW}_NwivE9wIQ>1o-wTA}t zg$DW3>*wspe2YLkhB86Qj`@edswm}h@{K*AAHZBG zwWG}&BGcu4ruQC`cZOcqgzmt+@vtl;V7|%3Es|Nb5+->u7;3Y5c>oO}yf0ZrAC8B2 zN6MSBMMQ82JWmDQb_~F*Iy({gZ59UvzE-G#O5FiMWd+NH%CC{?NM(^y`Qgr~+>lMB z9YjO{8eHWzAJ-zFdIPnqA;K{p&;DRmukA2utua zf{Lg~NqGdZ!RVCwloEY}09`A!stclJt|=20rKb2C=|t_ZM7YGGd~z0L#=58L6ui6v zGB>YP@`Xx1Nj2Cu)tQoR{&iFGX{+UwhCjU}A_l8S9yeI*_0gs%9(}61@~PwU?|K#< zHg@@xryA*Lxo-R8``BQpcfTY)KZGc0Jp-LJOH`ElgF+$XGUr>DvjY##T;g zFqE+zZYbfR0yx|*xM|m)Q=7<|@y)T_bazVjTvImq3HIIU@@@emjI1s*+sFb4-lnYV z8o?O=Hh*9Z#H#!7<>=0+S1Qf`^?upZTj!DV0tMSO(&I^O8f!Sxjq;Kscoj26V@_}h zC82q&;4q>7M>^x}!BqA7>CVIcAOBkU=lEGN@X_YEhC&#u`9IjxyEBVWhi#x1?Hb`C z>6u-1jgLp8*tvW(SBE)Mc5e&ha*=&YLzp!*YpX(E(z_kcyGK|x4L z755`|v5x4Lb`bWi9CW8!bPoi%!zb<`^Yv*Rgtei-0C&YX=(b~(L}6`YPr2(&bie9| z?%@vHWhCzJH^px(x_X6Fba_N~VMlb2c0l()4!TP$x}OKp^(DG~9nt-w1G>|5(B)fn z8m6*Mu^Z8?l4YG|iPQ+=P-0?Um)I`LLSNV<#|J=4#7VxI>DVtgUspor{Ejqi^eNCj zOLJ&kWNAF5+^9l%B*gUTi0(HXSUxoeU4M)2w;dpdWo%rkR`VoysfCqP94HIB*`Tu_6GMqv=z9k&D37K{w$ z1&Mqq%Q3GVTMG#&V=h_&t1taIZ4HV@23+j3BM$_#a75uJk@AMQh)fCXiIU`969E%m zL{K{|Y+)9#gC7RFu%-)N&0^oX{>QQ0ZvXsNqf-y99e{H%{mYM|0yG|kIXjk6X4HOQ zoqM#0vB(Bzw5V`@TU5XzhF(NCT?~vOC(;PRB^8*P&qhNm<58GJQy)al#yuBJ1Za5s zAtIVgo2_U`;AC4gpe_EwVhrDsWks}mxW?wuAjrcqe?%Hg1Gc+nOAk@Mu<)jG=~$2hOG~ROm-fkDNM@N@kdMEi{DmXY`7`72 z2e19}7t(DZH7vh|1;q81;Bs8|@4&VE)VdW6oa6fdZpUTGt|0v#w#>d3wamX0(Rxw! zFxEY7lJf`kc7l=oV;22d_mkxVHPn}UTZ*kNddsM-y7-e65IH6!Fd_!>S079CjMp$< zR-b8e07gGM%fRn*?#Z!`#kxt%5RTc_1Hb$E3+fsAXt8)(&NnQryoDlyTp+Ne5f%Z%e z8!XKI0J&9_JBF1X!nY3v#u3zCD_2c@gpv$_3HGs8>R;9mRr{3n!rxH2{J_sAf`Dc& zfb1|C8C*~+qqQy)Q{P@yxgEcwSylO<9_-Th3B>-X;FyZe1=8^eoIxgAB@c(%XwAp5 zeUZ6UGT95!dfW+e?frKYSBIMP`e9eU5xq@U54MnVmAW#BN%BiKlLvm&c%fYCTB0c^7H6a z+6YIt%jefx){Y*9A1;OHoI5nI$C&-bJINbtXGwh{(AbxRfrLycH$3P{f#=`Zc*d5_ z!8MgAQnX`lne*e|Yh(`Y=kQA}$iI^@@L<;HY>4CY?>r+10=p7pva=Q@^B0ZKeyjX| zukFGYqII%ID;AOZALX@y4i)ELhPk%cA1SYGN~LWO9ywmyr5nMzZkP8D*m=94i-*92 zYZqyQo_-$NMf4bE9{BF1W$f+k8d8a4d$Mx*nEbog84yodo*hqFrty@#PzWDa!mzPH z7z4p&2Ze?MoUs%+kV>kYfsS#5RcN1VhQ`8~pR4M3 zJdTC?AD^9t7Fjqd3xUHw+~RNjHKmoPM?$=8qj}Vhhna2Kp;F%?X+Y%*3(}Tt(!23J zYoTkr8Axg4bqH{sqAhq5VY_a@LKgcyE47CT3@Z`h2%NG3rE74C5i-3G>(D<22oO#; zJg>VgsexJx&E6ptAfqNjWM}6ud=+3!EjST>kH}xh`6*Ki2IDVA(cR#tks6l2@B=ho zrbu5;$X|GrRvcG0BD1e%UYx)13cvvRru>CC6T{Sn`3t{5D$|YvDpGzB5wdLHl~U2v zAe5H%=C>BR48K{CrSEq{ zH^igaK`~>GD3@bjK8R!MbJ@T9YKd-|vWV2{H0KeCoIWMpMBJwnTX35a&ULG8K$*uCKxv zun4PwDpX#2fqIdz_Z2Tvhpc6Ge6A;RSOV0=;^ECKwqKs%=~g%O$1B5&FtV1KACI9@ zqe-;oB2%e9iQI;lHuE6DASh{;68%YHECP7;_6{vc;ibx)r3hNqq#-kw$H|olM}W}SmBnKab6;z{j4`BpGT}z3X4BOW}=$*X#74!}EQ<3k+S44d8AfBOnWjoM7 zKC(e{Y8P8%maEpAZ84V1AyB;#`XY>k$vd*zV<1 z2^`hDohd_@-v`Wl$~dVb{|{l_myrk{kRnDw;AQw`Qv4kPBl4c5@dBTBXuO0PTEPg4 zXgpG)%bX$R9XK1B+3G4lz#iMpIGzj;sM&x*#^I77$0{4m(-QyVfZ;V%H}FPTA%dcJ zx*daFnP~tYEJdtRm~>1}-bJPny6C|4FlD;UG2Lbsaa8h|ZZmTw!_Gp!mN;G((~~i| zCR;eJmCf{>oU!1(`n_GB+k{lkOwxX7SFL^RS%P*w7g@|=Hy6QYA%VVj`(LH6{cbPP z!U(K=t;Dj#zUECVdgtH8Z<7Rp__cIYT)~qfK5xeSLNdxZ zgf^OkJMuQ~3)TMB%7(A~XSu3Rg!>L~UAh}mUYCww2$k~!E!v$w+*7)93TZW9s-PsrswmQ?(5DA zf(Y>xHv@DbUN=oj<#ZqHDTP2lQD&8nHgy+BnLCL0NPz5xECKF|g1FJ#JkIz?l3!`E zMBC*z#oFE%3oJ;u&mHxI=((O2eBQX4>tA+o7bShlaMrL4aS%2a&l)m~B+nW$=}xQ; zC5KAY$?#`NhTWgc%^F6jyM#>PPQy^ea6*^zRnIy)Z7_QVvNOM=Q^U)Z0^M9g4Y7vVzA;1`+hC98fX4{R9-Q-q}QfS-2S;Kh7u@qcjdh0a47#MuCN0 zv-y?`j=@*Yi=_n!qAhS3H|bI7>R=^jx|PjpZVyRhHpfiyxk9IA%IQmk){_lTYo^x< z0YvPWvyrG9*6r2`e;{DC>~+3y``t-gL`>Hsx0N3u)ZGxo2~CUo zx>0zx?3IiaCBpUnoj?2uQ`K9mE*yW6=bno&;+U)hF#NC?pWg0?wT?SV6{?CIk4>S) zI0CIdci$J5lHL)>2%E)NYr#^03x;iP(Omn@NwKdg)5vN=(f|Fan*!xwR|x$VK2Cn@ zM3LC17Ln20?y~l{dm{7^9@Y;!r%Et_cQV}dV6i{)Vr3{@D}9r+EZ6IiBG^z8$It0Y zn5~vP1Ca_;Oy8UXIG=kS=`zW6{_{@8JF%{6J(gv2w5-{Dz-bFI<~kHj{#_sy%=5zx zX+0H(OENXwT@1-$eZjhnvnNW*n@G45h*lAURS|;;)U_hM>C?F)Zgb3OpfhQAZxJTe zzRhyg$eEb!P@GDyM#Tv25qD-CiWxzm`2vI+7C1W^XZ6DZdn68miW6>k^!k(!W^t9) zLnH+C!mb|fUnTpZj3Xu0l`;-hW%MIZ*UI>8x6YMO?TIGLdCKTxmBDgV#smbp$nQe0 zhEvA8tV1)Rj2ab6l~JU7k&rMvlWd4k7fGsvP?!mgQGvz~plgAKu-G^A^dgU~NCAhq z&&8GKUNf#F5W6ox5V#u)U(`Z`b-s1}CkVrnp<~wwj5;S??U0Up6cGEwc#V(iWZ}(l zWV79NO5g1R6)Vt%SwJ-N8F@|#(~$D~W{KC=?UC)XRS`!KylX}5$>M+_YRLhvatztY z0^hX-s}RkkAU{-yWC-7q&;{^aAuh2H_Y#6qRVNEE*TTq>G+%$DeuR@*DGT&%Jz6Gx z8BzEN9Ej~nGAzVp2>F?W0THQsQ-)pG!c_b(dgGXzzE7|^=(?=aHXNedaWhN@BE^6e zL6-QeAY`I>Kao6irD=%3vZ92Q*tZtz;PpW-r~P-4^0XiEv=0-!R5jm7(5^NAQx^N0 z_dM+bj;+LOGyL(5Jp5r;n0D(7$8?*3V7vKYB-WJ1 zv6i_1Ah1UkkoyP`FesLY6eF*VdG%hNxDI?7Do3g@xvWso?Cd^eGdjs$m@JcfQy%Rc znQZbRNH_LCpO?o3)a}k~cUy2b>Z~*Qb1k+Tzx!iHjzX-if=FnLcJm9CgMB`$Dt{3w zTfn!+r4|L0vk=S7N9wfFsFPk@h*I zO3N5pD!@@(B(&>rz)Vz{kad2$yZq|Ro@f+ti&04hnm7`)%Y-&@A%U!2)-wxc4oYld zEHc8~SnS(n+Uhn53cK{p>`!0UHL)t1o)dG+D640kvwENh$OzMQNZF3$lWl2IW^X1~ z*PZBG7Q0%BaMVLOMv%JiSxRZ?Jmmz~#umjqSTT#G8&yNns)3gNO?ScEm8Ba2b(-^6 z;K_riNykxBG7YiT6XaJdFq8k|X#`MC&0W*U`z5e3v!y`FuT8i_`WXQ2uk6 zxMKT6mNd2}9VQ^KGjWydlE9T_<-@h4MN1?y4l1qGLh=YLYcmg{8Y;BMaNizfmNwbm zjVaHN+}A*mGe0pACE-64z_yFkUK$vk5xvA>UklDpr1ui4;_8#^@j@6{+*|U&1Qr)- z-|s`x!Qw%#c&+IbJ5qSPKsW>s;gW1#cXnc5DME!)(W&5vI=lR5YP$2Hu$jOK-L5Sg z{tL7DO`I|L)NCAXsH*>>&`#Aqj>Vm*e_z!j){X;SL6Z29_M2gdujjs^XEe=zE>D_9 z54*T3xF2`NFkoRbyecWrWb`hUW#FRmNacAM0qn&eopiW3ixJcnzWkZKH?&M3AHGbv z9WXgj`CP_t1f(ZS)7fwum0B!Pcg2VIz8NzyD4_*Qn)HI1fK&**(?a^|Bta|o0@U`S z&*QNhY>f!JSCa}bXViWv7i-vlxkYfh@K&jg2raF3q!JaZ=*Wfslzq{+PL=Z|6;S1D z_^+j?w``oM@?rwSqxHyYw5n_n5o?hb51+_lP?4-0mDyvO4U@?M)_@i!ZJ$mv4O3X2 zh%WWinP&w+CD%p`?^49TyH#fj>TJoscRf*Hi&&r}f)!2kUBipg&w$>l^kZzrgI*eH zT?&wZ>=RvF?fg>_>QrWIm6|7!CbC18yE!SJ3k*OMB03U z8MMW9j#tLkGNw=_*W#BOY-^>|c7CTNsmv&y7c^*?4|Q&k`y$u8arz8;%js%BAMp!Du(xnyYiCnl3`G&u|Syz~cb8 zrV0$3O&uYR0wjRi0mG;21(m*!cT;$%OmW*#;H=bn2t$ud?AAjVc!;+Adzaf>YjBL! zalz0~%zRF_S1HOCytJ5W&J_G9(Ly4Ur!z~uV%C8%j0cks+Ks|R(+VP!@w9nSu$2Q4 z=aQdR)OJ>W7KNsctCM-UR85;R-ceSqM=JwVf?De>VwRhb z>Qw$X7W=LAA5Z1qpdkX~cTDBq{ECK3hF?L-GK~3(yM|?&GP{gmT{9bJae!I7rfQBQ z(9lzx;ZoKwn$(9~A^n7^9z|&R68y9*J`#rm67hf8v5XxE=bt<-hx%Op-%S<=j--3^ zJWuu35^pKS08M;K10-p=T2)i~FJCp*SEM0_n@wNOVqZ0`_oYu#S(DHzyG=SG?>007 z-N*$MwOojEJ}pYbz={tkYWitsPmh-x?woVRO-6uArduw|;&6@6#f1g<%{j=+E+Z=w zJ7cB0R9F6V+9ap28+rfW(mmN}?BP6VWu19B-lkaIGFNH;OY0OWN7#Dql;;ZjXYvA` z?4--C?YHZErakkLEk30)mSyYRszF#z;s<%3OJX_JfH0p-`-1Y=BVF+}cW^_L5$g=| zmkde-G3$|ZQAT2qTxFapD4a4Pj`zt_Mj||A8w^Bx;6zCUrj8LYJDA#SYHGs>V0&RF zrq+YSotT=P4x-CN3Y@v=JdPJM4Ce9LG^c7#A~}}t%%+cs%20r8jpLj*%uvNeUPYn# z+3rr>W`sfuiL4|`;4^jBC04H6#w0t4hiB59@pVe}zF}ev*<{D=R>m7%b21Cd<$7UG z5IOFs%ipXMC?TrzKOq`w{SnFP{;sn>jz+e_4e6BZ31x#jk{y>{BZCvrotH)W(g5jc zQlg|uczRdz{v2m}JJRSvUfGsWR8HPcbq3Ym`Y6eq4>B**%Up(w#F7z;x&nfhx0^!( z4C-cdCz{x!Glmu>%cXm3Enln)RV*|Nd{uk`UG|)RIJ3SEshp7zCVjt}^qB1jD=ZL>K@Ea~=0PfZnF`|AAF<((!3a|3@7+NG zFS_mBNeh`a zH#_TCipq)nBaJfK#=o&EG9TcKe+Olc?aFc3xwGAwb)*iqq^OgdyCQT;r-XJUkD_u! z*6KHuR-Q5{xJyUzt-!inu7XzHdTO_Pz1`b_)>+K05PsPM&<1)zq}}I*-5!As)H>?ZWU!E%Tb7}J7iibLg$EyHCB{swKQ^1+a#1bo7c5m4 zO_ZKu!1Hw^CIkFslETtBcz}OvAx3$Vb!tLGoaxwqArfiL-<>P)U1`h9s;M_xMN=uL z!*nvI_$`ZFtwgw$B(U^(Djr={ zUAe61+^fa1aL5_>^^kKRAZ!KwWMmjJFo|g}H}A~=i*91e9hzRrKL*PnkUCK7B8sOU z@27@q2AnMUN*%-}4`0_-6vS$$wkOKBnd2~cc@uSP(g95OIHuwQi0D)HLkHRBkOQh1 zT=DhY5+2oo`hG4=00iNmBE>k7r^1MvsU}r-6$G`zdM5^OK8u}IL5GJauiBb#jUeOU zV?AnzA(cbP9tU|-srA`8wN{f&O(HEA7ITzQBqjZ04pJV|v!R}4vWI1VwBmhb{49dou)0-K5?Gy^I!YN= zt3!y9VG1-U!qx%CC3YcSOUv$ zTGafANz@<5C%3mCP;Esov+ygt$D?L-T3iPLsv87CK3g{C1$ja4>3y~SiCTZD)(@LW zS|67mi1hH1cWQk=;ANiHPn*8BzAlmRLG({_-jj?d!ul+MaL=|G3EM}jRO6fLdBe#1 zc*WIb#x7J|CTPYoa~g3W{`;|OsMnG58Y&`oY_02`+DK0k)Y@|14?8%sS{4Uv`B7yu z38{B!&-I{&T?*73>@hr~ONOmg{re-I;Z8c=78VB>wrgiFY>zOV!WAlhkDG8}%fCX( zQ&E;J$EPd?s>ab&OCo%S5^g|Nb0_9}xe|8f+zv$r8A+b5nnOp?V+P#jz^|}`^Y7yK z8;R&*ej!oYB@;g=6FcvUkU145+zMNTwzzG8;h0xal=0_2((gOS2qAx{ z`fLB26Y1|rW$SOVit;u=x)$X*7Te~s`;KtjY#fTgFCZhkVKG^q?vAb}hk4O#w|ivg zBGt(Z!Ftv)}9X48$CAqWhDpMRvC8a_eF zb77@!!iOs!xoT*BUp@Ugf_FXR`#Fo9QDf?47xb7q1%_j0Y7gqm{S1IzAzH&Q_9PR2 z4@h09>THy88Q+?&F1%qpuCJ;DlzPAv7y2?N>pkl7%8!I<^n_bV*Z!R2%`QO0I81G3 z(0z7#9R&C*MdU$Q8A&TmeDGDbew3;N3M5sv})@W0`;tS6rEc}aEV2~SZD zenNn*WuDsw2Rg|cSG5I8ya>24?_x|<>I471nbf@{-Yvqc4e7)u6hnm)KUjI-obeV8 z@jPVS2EdiIekL4c_$v@lNj{TQKoaUymV2n%JVT{vCQ#Qs|4A16J>TiG4TPmL={z>O zALE@a%?xBZpWTIkgsAS zKSrt}(nX52Jb-j5vz-2PI&fY#(o;O7;{<74ou2=@eJhoWZ|!36`Bz{9co0^HVlYQ0 zad$m)&1`4_pS3WZ2-PGjaBYvi6ySHS26Yb|zwWkiURJDDuCia921|`Vg#K?G zW&5-iIoOJxW_OZQ0<8xI@<%@E=l2CqLd>B)fAzmmDrgO?1>tw)I)M)FTOz;nXb6_2$6O;ws&`m zF0_{@V@e1Yo7EHp>>p68Am__AHoId51C(Puf-(VOLVyw?DwrjyQ{!mbS|UIdf~@}1 zYpl7HBe5hVg*AlMOLlBhIDy7E=~BxBdKE7qF0?6m7TDWVoEBNKb0Q z8Z(QfD@EJ%7r(d(jdV#*x~F(a&zx>YpT*0lPN3HKVh_lBV1?3mi87AUXyO8R$fI4b zw*h-KekQUEehXQ}=EZ>_m~ojL*HfA%UeL;el}0%Zu!$NSr09eNNE9#M7N6P%O6{RC zG$jH;(QWbWnrMqpurl$-O>n2wtZ;)k0W1>KSbM3h&``O zcUQyimW;nPa$S50i||b&AJxesnI3?No#T9KQTCj< zj^60<%b45%J=LyYzd(OsBbhJOcN2qYsyPO)Y_Lp!IEI9Dii1M%pyNW3P^fGlGXm|X zOU3}~->l|0ghs>4C}HL{AN$HGpjy2SFzPNJhmpslTdOO#hAO_7xOi*)Arj3z2mtdc zE^9{EqkZ?X`~d#j6@LrO#>xV_z}KdZ+g6c__Hj%3_f*6gVnwYfbKb-3Q|y1VCvM+& zOY+E2{_~;y=W${i3tRLR_9iH1Mn-Rk7Fa!9f~L(J1qKsB4Zp!a>(0F)T)N+tO;HSz zSZIv`GMIW^0&%{}Q!)H9I&3J`&HsV)9{7!^ZssQ#cB-S>X$}SpqA}6!3wWgfYT{e# z(GQ6$z)P_?P|}DB?1O~o6N=)MTN(9V!vW2l^dR6l36q}}FT_$Wtt;~Hu~aT6Mi`px zWgfwwM09Icti_wm7e6C1&U@j(hlJ+~cc!_u~1~teLfo3*E3N>ZTx5XC}&JRJ3@-&%TY?$Cpunq)ziv2q3b4Q>4TJHbu^5(n@ms);hev zJeRrHJmQ&?;?cUv@hOXPCY#ljb)mA|5bN9@RjBU9QLHNmHjf3Br7|UsHXuxiA634& z49&DidoWkKW==cWs)lZr|1!&=Cs}{tS59l)r?nSS-|=-^#~;7$=Hcd6yi0p8S{){i zqq1?#CXQ%h9C6XwXcFD7L3rd@>#A;bn1*q2RMiV9@X{c54r{D3>wy;bG%Sb1P1t=7 zaJYxIWCO#A4tMzgFxy~mK!ZwWS~e5&lHDNuGBpMko*gJG!NE>sofORKDOraHvwBI^ zU}VjVM_0>BKYe*A|M_zKU%A?x)0+*&j*GU!vX6L2dq@~TWzK$q9ObodAZL)kJOfOQ zdmM~mwTFXQ#iGUIR4Qv$kk6VGQ)*Vre6vDQ%&PTbL3d^lT}-mZ2D46+tdYU2$&z)6 zmlZE5k(|ka99-!D;r-srwCfj4M_?mrkogNw$CyoUc$X3R&(pgwS&R`=?#t#&3@;c* ztCOR~L>JG=wT2DY-ws$qPmFaA-%J?KB=?g4d>dTWA~L%YG()C86z(@vA>j}%Ead2e zIf2&!p7j|l4k84LK0*p)UV;jIghdu%Q7*#Ee1tI|%wNds_AHkWH3#WcSx6%mX#_~~ zYd8rAaEd6N!!sht=?I53QCY8|52nlWY_v}7!u}spLy#(!)LuyO zUsJfiOZBlSSYErCaX&mK6V2cR-U@o;|JdG%hd+Bs)){;)!t2L)T~mKDLggEOMA&eR zmK!&oAz{ZereOHM#Z<36qy|p2(Bg!&K*t+`sADj`V?a_I15scQE;57e15Lj8U6&Pg zNFzwZeEDM!BtoGr`It9q>6HjFql!=6g44*U>dGy+YZ~4@>G}Pn`u*Vi2L3*2<}Uem z2f?|T$1NP3MC-KXSXzf_S^K&sO%&R}Gvopo=|%nCvaltvEIfdBK_als=FI$%Z94Tsm<6PBr~UF^ z5g0*;5>v_%qS3{`X@;V}t|ibO{TrBsE;x4BdKu-GbZn;EZ!e}j*EjvlAYJP9rH zedbz|r{1N_EJ2>9l>$^?MVN@IQ_hx&Zf6aP<#Lx(;BwA#IfLYi4qR^-M2cZ9u;8vm z;Nh8jtuE1yiO7IzQ$n-m%pI=bnF zIH1fxV|C@W5ZA)2Gj>dL+XDDQXs@=SK&^KVn%w2Mk`cQK;*?Iu=`^;RPNWXT(FAx( zthTiD2&tWj;jt|{?6EeDSWM4uO(9IuaFVVKf8p5NX~*iVd1T1ZHX&TJ=}Ec5&CbHDXNSe4>Ov+^)fMc+jD$`E!SqT6qS zH0@-sHJ@=MZ@U003hYf~Gi7xKQXmI&dODNCKV!*Yc$~(N{v8kWnEV=ik;aZ|e6=GC z5i(nW1U)^CbSTqTC$}b1GM1o;NCbge?3a|=H~m?4#7ZJIqoexe5G?qsh?zsB%W{#1 zj#k3vLVhI1srqnv@eDvXxh%-Z?O;bM#H1n&rz0&iwRl4)riuKs1_K%efi$O)l5dAA z3xZ_{vL(>BJLv$w1_&V>Wv72jZJh)S%`eJo&Gk9AOW`wolyQit2%y0w5F?jdg6r0&|`=D}nV z17>w)v#PGq9EiGsD(9n$-I#%Q!WKsB4NhQjs5wfs4wXUtZe`|W0e=qfWqXVIvaHR3fTp^a9kYv&J<9r2S8l?OWytBb+Epd!?B)q} zfDR&tMGow2Sg40E7OEBIkNlmezLN4;wf#d-2wfTw-* zD4)D$8oSCrNh2=1<};h*cFAti1EiC7%_)32x(G33mP>faa>+xP5HZIv10td#1KPLw zWTCy;)a0wx-|m%}3Hk#54=I69%?=Xi=a5_mBoO0V=oOK|>U181Y7GGQSlb1q!L0O{!+%z3K)mJ( z(EZOU4bmeSmgnm9SFi+fzw20N5Z`GvW4me3`oSIlQO{cVsi;ovbobkLv2I0ySwcG6 zyC4b8oMVvJOfO0>Leaif^}jU#uHBnBhW~}tcl2k+M(LOHYu*T&P}hVJGsbwBzmU&Z${RDl9)h^*UXD!V;F(fA=%uN`_YLfH3Zn7BOZWr2V z0EdL>#HyR$-_@?->CXc^JbkZS!k-Y&7N0O+7oleXd3?g4U4$+b=z>f<(Ehct0<0c! zXhK}SuCSlQBoXStnp8%N)(YDWlWQXdlM_>tyFjjIH$)P$2CB*NwUgtonQt+b3gRB( zW-wR&jZ^XubxQtW{yq2L^G-%%%7ke^k`fI7|$K!Tw#J6>Y>1KSCi^_vA{ zv-uF^g7U&_OgjQPrio(k#B|j5Y@7zWN9yUjhn1l>x~jwwrDoCO8vD!Yl#MUUj~|ZbW5Ugi)lnM z5#91tD!$?NkDn9OIDF=|3d*ewa%qHIgV$-muNc7@wu6e;S8iY5j2G`v&H5^YR?tiF zRSiFPi%+RT1J>*QxX~ngG?v@7Nq*hR8=8C?s`WIr-Q^0NIQtc-9 zd@S7rUPP%rjcSPJwJ;`MBvq=D;12@Uaf=Ova2`#8`(Wh|54TiNIp#PRF{mA6_Jia! zdsXsknM9`E;UrRJT?c6Gm)rv^LHv@ZccM#Y#!Gr7roO}^x83nMh^&(FG6*jz_X7Wh zpWh-$UGyG@bMDX@Vve}S>a7phw@5ix*Uek!j6}hL3YXk;s6(Vd! zXl#jLrG!+9)vjv8n+iEttO-Gb8i6=|UD+XK1-cPAT}9lw9dq@cxI|x$cmB)N0WGQs z6-+7EeS26En#pTbYFCg9&y|N#5qcF)h)G zD@1(d#(arR=QF}}GMNHW^lYZk{#hHn$3qrRo#}|EbNU*<#aEQbV@XUNwGlj^&SE?| zs*{C?j*Q@jY7Jko4z!^&eNE7mGzrmt^H=w^tz6G?2>?%VHPzGu3AsjcnV)R1Nu2HW zQdO=PM~#sT80eA{#6S@@NTY!91nPrnjAzgXQ)ui`JenpA&zmjedJew`UU$4KqsGUR zFZ^Q%a7rwKmCUJg(FJR3+E^9KQdX_0!e2I7kSoJH{A;S&YEzj*(DM_*I48~jLLu6c zh50oZy!iGILngFE{pZ+23rnh3@e!JLJYXoXdQ@$vgtVIZ9A;!CGw+nqzaIlY{>yNY z=uphZIfEJ^!#WFpDc5^=V136o+g=HT$i#kyxYvkmPpP`jV_cdK+YRw1GYmxOH(ZNS z@syQ5DY1en$6otQfUNltIn}H9H&k}CCc2d!iuz8##1a;+M$|B5w*P@z_ayq5IHeKB zu@!WIp&9XYjm(PS2JU!Gid1n5T^>v14LzM$p^}gpJqIm2Mxd}Je+vT06v8o}{rvVU z(yiBbWeUFX3S&K#vZoHX-a;#4`Cd*9N8ZdQ!Pj`3pDV!(9~>xsZ}V=XT*a zVATt8=j;@Tr=^omzd+TCA`EbtGWl6yf_@tUou z3pEkryhF?|~kQ#tzZ^QROzIqbEb#61? z3;bR)mta2DjQLm+^RdQUt@C?M2@-Mojd}6OI7+M2k>#Qa{luiQIp8Xo&E#|m!uo$Zw-{J=!dLx5#&ZtQ`I*lHXuk4Pap0`$3^4Pp02GYgSsX-xJe+OwnF zUc?<*0q5TVCGjJVz;}XkJE5#+b#xo{EZPwT0HfTxZqL8>I%pq_otE!qa?f(Kpj*M9 z`Nc-DIqe59q*^TfZoE$VK^sCKZ6VqFguS}WZ|tLm%*>5Iiti7R4rP+~qc~u>xUb+E zn7ms1B4R|Ac?4#!H(cx}Kitf~n^?J^U5zcCkQqRX1YJ(z7Io{aMCJC?Wn39vOjO*{ zsFp2bvtK7TQoqOXp33d!AJ8lwQ59JL5pH>L$2g>JPeVpEKN*k*t)u5c*fhA3C)>8%L z*c6nrSHSUCh`~cZ^SFXC=8BWp@7m+h^@-?uPw!MH8l^mqgMo6oXp0;{cpp~`93S0s z+pxqG9L~{I>Pr6u$bZhF8k3n{L3RWKum_fKA35@L0y5mUjZxkl*R3oMf4i3zv<~6T zzEKEA{kHDKx2u3l-txSb>L4#{Q@;#E=a6HIDfw!UHB$OD;1n2(vWZ|+^JFM!rT+=w zBxM&PiYGUs3EnY}JTtht!!ZeQ7LgMA$o|kb{7XfN*_XWPOU%r_+IuN6H{!*9my$_{ zMX(CmyJWiBfVv_WKYtp|l+RQ&xd8pxJGA2L={A`F7ni4G^Mw;lcbPwi!?o#glGC%7 zgi6E*#S#UH2_-P?_=J+yz1^oRC(l`_L%M=HN{j@f zT@B||u{gY*F2@tHIM*S)76#8Pr$3{bnT-aK>5?p>WmF&D1j+qH^hSW`^!@f#oPvc4 zAwvEcb^)zxV>>-e=;FFIuy9WcM_DWA^5NziN)P6A=`QEwp573o+Il`@;0jx&>mp2| z*sgHQ^Y1;8P5B)Q@J4XtS-pB$P8m4nyuL1A^|R3-md48$ zqhZmT?MB_=?BO(PN0pn7@TBG2wT9bu%!A%xHp9&45JpCvrF76buX^ki+Fl(LA8Nf+ z>gnVL6uHw_S>M?N~;V8p~iD;|t^S~EXIDA}KpHT@`|8>S7YZ;s}86y1(5a&XVL zCwHOrc6V~i$`7vzQ^p~wI0g$3R7RM1`KI_(9FpFoXVO|^VBfTW(~#WZ=1o+F8%k29 z%wDiFxE|U1EWb&hWm>W+TaVtfggZ8e>!lZMo~pZpeK)scFyn6 zV4aza=0vxVcUM(*z;pP`YIn>Baf~||k8Z54+!&%~-VLx9kjBm)%ENVGm$1{=vYnF*kH@F0$*oH61JhMK@ zQp6Yt3{%Z&K|LC|I>8JrI7|@Nq7z%3=A)#=^h6NTmuU7iv)T4lGlGnjSjITsmUqV3 zthE;1v>>`CfXS=b6p7$9_#Vr7FY({yAUc#5iRp|K$&wN}jtLY2Zxtmkkk6Hj)~#lc z&YS^`F+R%Y@FSd@2zP4GsL9Fu9KMQknv&S2hJVOyIhvJ2boeBg0}$3Q+K>4 zcy=_`0+mN)3@&ZOtP#Is7~L*AsO%9%c=7PZ@;I$w_@dJOWWt-idgMGTO-oOrtd>?{^oAouU!j6EeY9fVRnS59)8ezWca)8xO`MrU*$aMm&JQDaS$xh$RoMO+d z%;OhI(k2WWZjreLRx)SP1$2rIpGmMw#iwk-4H2OVGG}D${&4;f8O`^)9b-CrbXR=;e=(XuTu)bkJZb;7_CKsw4QMXYMgP$ zE~V(wJd3l;&3YbG<@42*ELEd_m z#oU5t3%@^a0vPl}{#sNgjN5W=m>-xFVid(E8Keal`P}(dxF-7p)NHRunF;hnBcH_! zA=Fux)t8L*IO1;P14-*{*mJt@EDtsMqwWdPNWAf;Qf|Z5oqO}h(as0%C_4;8!kFlX zWsE}wY`6~?GiL`-eU1zT^`{102?KSDx#I$esFlo!vOtWE10b{iGK!v=2E)sB6z+z+BGvLdsOkBpWtJmBMB_9((&g2V^J>qHKG zRpq{sV%6;1--_sh^{Ya$T^j&G{QAQMIp!h5p;+$e~&x5r1 z@X`bZXV1*p9nCKXK_YJTWEuZskW|+dJ2(ER0hYL~fF{0!C0N<3Q@_i~N%uBwy6z5+L=e|AU(=sR-(;9W(O+n zhB$ZDe#HXJy)dh~P0QdyJcME-9H%iw<0r-ym_C83PM@}f<{zS?Gi@;7nZ#ZipCyYe z6sPra)}3#ch@3lZ(YaIFv<;*Ipnu5RX?IuQD0tp>N~cYV-L5^(WwW_qXM&7Oz=Jy; z?ZhQGy`UcWO(Ewv@?9YvGu%GEE1XZq+{G7rJ%#5Fg=d64rVK$_Dlkl#^`2oFY-xri}yb&GWy0$P|=rcu{2#&9h@R1_By!(&?~@glVQ zdAxjy?3Y31QyqKeIz$KHTs*{gS;XqTJHgd$EqJpYOSb_Fl(vl=ZCd~#`Ga`ksJ0+5 zgYSf4B{-{P0lQ*STy&a8VHvrJZVY}h?pzKheZXbxNV&WCA0E?f(a(fCb3a!<$VAfLM{8Z-I5}N5kyqLG3NZoCV9#ogU&JI~rFH^XqLoWz1||^^5tHvR{n# zT|46C)N}{q{&R!JO)Gb{S}Z%}eXRX+mZ7Dvh~{|tdQR#9+L%C+$09f4s7XBfRCVQ3 zI~YTIDpZz_iyfQvS0gk3kGOY%uXD=&#!sqG8`qQ45|`1mZgm;z9x5E=aL^Jo)V*We z#xQCop@wKkLyjY41|vgp+(Q`|LuE>nQ@6xzoDN3ZkGkzh#~jp%OZET#uC@2`JSUg( z`~Tke^ZH27zO23X+H0-7_S$=|y`R_AEp5C~z++KnqMu>E~k_CSN+jrCt ztNJii$Uw}K%|adGhL3)s2|l&u`Uv7G;#_3Fi04*T-n60$AFt1Vj^E%m1r3e|G(L** zFef?`J3m~EbBaZRvNmY|LOD*}1-G5J&PsNfb&g`hO)TGM=mNut7#ci9r6U#muMe- zZvibLy~oS`a;-iK)gdpRJpgQ=cm@`GB3x_>-Ii{{vTdZkoYu;-h5SU!W#OW< zScoSK`eKpLCXDATv7sT`&nvLs-($wPC@#L%qrJ)omxSa1^$lQk)J9v69Fk4+BGI+XRF6}1e{R%Fd3dr}!10uXRGh@2QyyC%I z4JmxzMNZe?V;8P2Tm|F~WO7xE30Lv5j5RGt$KpeSTJi{z));J6Y10gWR)NPj!2*h1 z!=@sqA&$nJSu`z#*&MC5O=!(-CD^+*p;fy)lG(G@lHbW%pDsF?#MeE%_o%GlHXJ_G zJ0Dns4%6{ROOg zBhvy9uIp;kx`%nh0;qbfvBQG9HxiMQGjARi>L2NE?e0E4k*PiF*+2Qu{kP?S0Bwo~ z&Ap+sk9}a(#?v5d7P6K(B)LTIupF3NYTm>A1aBg~aGIk%&rJk0|6E9%`!=JihyYMk ztcYHF5oRgILAVzDw%{XAXE~R6|Dm}?jN>{y-aAKu>!4@A@y!5VCx^N?grni$NBaBL z4Lj5HyF=+ybT9#~7}}#yJ%;+oI~p_K#PU0uYd;BCcPM~Y35#u&NG&F+AuaOYeV8p9 zs*%Y5dizz%enQ=|u@Cx_a2Q*JHN;PV#JGh!6P{ujRiD`$N)Nj*V8jKZ@N20ky;w0+ zFFwHrK&ThH{N!HXn3OA=Mxlu5g+PLTg=FHA&|Fd2z)~4N_F`&HBlJ|WNF3S?-@!cN zAx;ge_!NLo;Xg^yAEgJxxv8pIJb-o1&OSpnwO8)idze>zgLwFa${*cvobl#duWhT&DEjq7XyCwFoh}J|E*fe`RAfH<#3(;2+KdgEdpRqQ3 z9|AWHfC9Lwrdt5G6f_SXO2rhNnOSU(2(7zb_C#)w}(7zaKK>uQ<@*oi*tmZ_7xMP+BY9M9s-bxHY53>Wl zcNod$eyCB5QM;LdJA~p7mQ}rb)e4MTxBpI)qR0Fu?u?E8gj?4}fS0^^+;47$2QlEX zp+!MFTuHH@TDXaS+444$FDWnRCm%hH$|8BgO#awM?Q5v{nXri4B&v5m`;tm^21g41 zQ}?l^M`t4p*t76s4)~Qk*F8nAf~qSPuAQ(5Y0`Ist2DI!E2y+@FIN-}1H1#MIB*kL zaX7mW9M>sWIYbwi0vPfY&1~xIWX&U3TC`#pA>F-#sAWkahj3D^nq$rr*RwUSFP*gILJId*?hy>@+ChI(5= zEO|Iw=q(xC@GAcsniRKf@Ocqy(JL4`plzAx0g^|xAO&sq)q%}!2QjyxXsXS({hr==U3%an!6UYP{~-I z9(pG`BL=47k`c~*7=RcmJ0k;=x1aThu10WMB-Bc^w!)FeX_sbwj=%f2bMeRi%fy!5 z7R%8Ud>7WNFP2VLu7XTUK533*DIV0)Sr@mEez3GXFlIedx56OJ03*HjXFkdcfH8l# z0|85X--n_FO}6-Q7=s*|;Jg=`aPWA#1j_H#Na!T7nHW&za0iI}-vMU^4AXM~3~ZXs z*%g$WQ)J#1iKtmi5-_g&j_+D-B%9w9fR~YjDp=f=FlXK>B*`Hh>3tagNHf+}VHd*34LGVb zYqNl6OkyD$p6tS1!7)NtEapWBNj)*``uDU~0 z`XozWNQHqNJBYwydJS*^n5OObfD)13Z}ATXs=8oK`mqkf#OCU0w(8nFelqSMtHqfP z)@618BMX++V)$UIwQr`jhskI4{BZk+B|ip;noB{;9>6&_3ssMJH5B9(YB(qFGTh|X zZ^NWwTk=*v&QajbRE4()zn_rBVu_!(b)NDZL~s{LRxQV!9VIF^g)oZbehyS5d!TZ% zBYFkj5jkjO8i<6OLmZO)V2uM*Omlrx6q@Qb-xcBbbQ4TpnP#oaGAZ>+@+*Me7$7pD zLWQ8wdGtv{Dd+`Sa@u3wv-#&^;L+(M1+S=b;mp^t=UBgWL3a!W_9Y zZqd=U$EWZXb&8jHIF|6Sy}$1XQt9lD9n^A7ubf0NXi?V`kj%w-CFTj0K$Mo*F^ltw zQd_DLzuj;l(r64(j2j-{Xk(Qfz&c{S-h)Oe-3#k8UNZhfeeDyY@j~t|r$3=rK!D6E z%eb+RVr^SpgCdaBXu~$zZd-kB7UHrXMYu@v=!@3(=YnRp7Y8JWH2VoOa3|%0^$?>! zP)NVnLCK8wpXdLet|~Cskld- zir;)yOk0_^CrGx>bJ>ZSbwj}OzM}~yPJ$u>eFtcLLU?v7p`MV!3#bwtSM@fF4XUC9 zUaRl!+M!BOh0}due-K(!xBS6h2T?6jp#}CA%r6cUrgp_}k|lkmZB*itd8iNym$@(> zHc)7UwhMWqK-JaK#Pwf(hD#%ruhEm!A^kLB*JCYdzil%bM=!9G+~MSUbWG;5L5Pd} z36L5i`+Z2An^-#S%V&QK%0C(|Py1#7feL1O z{qzykoA69V*^d^n7ZEscN*!)L@+Kh-DcQbbA-_XES_u1AzFMP30^vcEA4AY?AL6ZN z-5mUhh3tl15pIwj@jqzG7K_=LyocihX8eYzLc&FOaKnYkd%915D2LMGVbG7^Kgd&T z@V5}c&d1+i1I5k^eCkRZHQ3(tY{>ukr0=Pt3Va*|u+8)fJ+!u=U z9>RHvi(zbj)YoPrb2i3L`>IRU=T#aR+gTagFAjOt=(J|heOlEI5JgNUYLfA)QC7#| zi-ku!gRUC=DA>?fjm)*7wz(Zb#3MDlf!QvKjNPf(NV-!47at(TE!|P|)4NCZjjTVt z`@2rABu#QB&Ka0|Xeti8)FcbtOT#Ud>VU%r-|Q0XwB*b+*NBeI;~k)4+g*8~&!l58TL`XIL5Hf9x5;IwAMUJijno!HDzPK`;AdG879A3qi2iL<+PlGl}R9zu*YICK0jTCo5=(KYWg zI1g9wyxiB)8wjpriL3KLfcAq9hsyi)d@&;agOg24&e@`3w zg`#9b4w?R~N_irvelZKc(>TS6!9MCU@|lb{8+XY?M3H6LqQWCLQbA?8-f9f(iwt^r zV>uv0&tBM)RijrQ253I{^PX;;_C74~ui5t@h|WZw_z!}>u|2R$d^ z5Kg4z*(8(3&O>3Z;GrELuE&T$b8H`Gk4>nI1uuFK4Z@*fnS4I;<_rbxhx`4hO8#E|%M8i`h+6wgY9}=ahW>)$toe7{o{` zcx&n<;Owtv#CY=em+I;B7u+VP>MTLq=KJl?hCkM5Zid_#MHzj56|uE#`8hWIyPMq!6tg zHAZ@Qgxg73GuLbzruKk>Lhbr+!7LF9+1PBZ`Vi<+63&8|CFoW+-xz>G2RSn0`!A~tZ3g?}Vw$l4Zocig0xJ6| zoOJ`%&S_NH_`X!QF-iy+$z$JmyOmJ?Gu7p*So+b)@^ix^{3M&UWW@h+E|{gSCSvEK zelhc)ou|;aZ&1LI&*a@z5WvdL2hX1owr@OcG071O+zg%dV!qmzfLMX>fX>*vto)HZl3_(#L2z_fO?I4_Pezo(WMHk~d$0 zDuJN&K#F@z$>)^Asuna3P3NyJN`*H(^G1`xN#>UJP0*Kc?e~N0BKVL)B6Y)TGEFNe zwalhI(3g9(^E#in&iCmSS<~!En2k6t)JbENg z*FOmo5ME{z*Bm;{pg(g!*8ELRRNK!dCsS3+6Z))Vf8l|^EVpR}!yjro1NDJ-X~v^b zdnzaz@&0*SL&BF2LunE?3%6)J#O0LKR<~J9?-;es9v|Z{Yoj(1m}0v~1v_Msiv1v6 z^2jO16RG$UkbURk)e5Tmr7*8jncFqpfKAJSb*cz@5}$d%i*3_!O!=bTv+Oa&_?!nY z!QmMlO%IW(d3=l`Y^Xk5a*LQlNmp*jigxBg7eStfQ8MIshO=UR6}FXYiZOoR@!Yo^ z_azbLQ%P4(14#m6@zE|*TkjJK4y(^S)!bZ_NPYyjR?bH4n2p*%wCdBPo2 z#~jiS{eM}p*-^2{BFR{i_}1U?Zk!lz1>)Vl$~J1KKPlZA3DCO16Jv?fQnnGdTUNqMcD-y;ImK>69?Su7Wb~WCpI+vkZ+=+jG=jj`KH2Txy?ZVjyinnT@3k$5fW@hy~P&6@YyK zlQbEhPq0M*>x!pAK921%$2j>NEg?`exds^A$nWpqw;8`Gs>uUXMw17WA-xspDwW9t zAYVOr!JC5M+?DH>m-#~H3!Iz*BZmK|rzvkZ@79d)Ofvw*en;MOn zZHTOR+2qZp5*DPU_(<(M5UD^JIKIfb%`<=H$d<(r>ZyZItHI4E%siqR*5-u1DwN=v zT~rfLIb>lIW)pmX?A!ekU*k!2;cSRKlhL=H4Q`Mb`nIEm5?Le-H67J4+o6UJ@`|me zYT?{XL@nep>?nxEUlJx_?i??aAwOa)FA8}N2|0dHRdHreRW*~+kG0Sdqkz6jf!5-ugHjM(B@P-)Ilqh zVPH~wP&+i^my;Fd-2=+;o5pWUwFP-$wZ+h^*-cq9TgWQ2_E4-jlGzv_sBH+=Oeq!C ztT~I4Y6k4fB#>w=Cn%mLs)aXg#Pcd27{)AE6?O& z5f+T%1C=dr2uU&WhaSa?m_76;zIQ{AvuSY*!WSAue_$%c^go0VH%M!#5fEm=B~nw1 z5lm>X1i?xTmLfP)gJlTL(%>Wnb$m>njGzvVspSaHQ2>Y_hlTg{bdd{b0&P=>h=cq# zEzVbAMi_+uBTRG zchHp()EQ)wcxKl`=$BDrJa>O1GaQ5~-9S!bK1)ZgcepB7YQw>^nkK zFyac`y`)gCILuM_Qwa?vl(x&y5nyr60 zFFz>0Aps!|5F2B9aQ2D_u|3GgcAr9QFIx_eZ#Lh0f%0cFMK+D3c01j-p%qLZ@pK~T ztvpna%}A274DGj%5=c~Qh(pK@Rg>6J+KBy6f#cgBg8=5T=t8Lqs}|iBeOk!ar5;E3 z-6RC=N$58bHSu~)%wlL@c$DA=`4N2*35lQ`Mpo0D5hi_{Gy(SDn1C$$j+EsN(a#Yu z2TM#}xG}kctQ|B9wV~8A5&@T$xxZqEWU!wiAzu`6n?BZvJM@^Eu2k;sD}A?96O)|W z>3+v}X1l2gS$Atg-SBmQ8H?*$@uwRPT&sko?(wtGy-N61#Jit8u%tw4ymxS(oIQA* z35V&U2>FZf7*tX>Hmfqkv`aC)o}e_JIf)L&w1(LsOmEjFGoSNG4K-$-W43j- z!>{VJL1SjYdOBt{<(SFgiV1pOFlLTYJ@@})%={zH9{OWuGZ`~--$qBkA8(Xlk;Aay zfYroWP2^aiA)<+AX(9wU4rmg6n6Xl=!_oL-{xlEASVq8CFGBlK$d#`tz2E708RqAQY{=SUy>xQRLc91QK|S%ga(K<#JcfM zs3GMo7DB36w=k)&(p$roI#B^giHK>%DF;rBbd<9Dkr|>%`V*;f&mX{+q2?j60ObRc zh&rK1GKJqe(8q6Y3HcpYCm(rGFUA$qls4 zr34+mmk%@B_R=29u+amwQMeX^nVaHm4KVXcztLKRa2_(a&8@V}lUCp6zM(eJm@_YP zGV?aoU^t=C>DuV}ext<_3XPabCqa8^tDo$@+MaeZ+xD~_-J{zayLwo-tCwo4^9d{T z{Ubth4D`g8*jRhQ@3PzV>@5c(FJ4jN0vDQ_x~5XzQI zXaGNXlF@yhc4wp2cc*{9g6{Yjp8#AsBN*c5Z>LDJvU)ht??(*y1NW?54A%ViS&THI ze3F3Rh|PSvY894}OgkBASW>QAvpHj^kCbXR&jt{)kk+>&VAfK1onJ66(5E64?Wp0v z&6}C1oz&{RkXCcb+nd-69VSc2UmMa01OMuj1{*MQ_|dy!U!j5Y-RWU0Q-#g@j3Ba@ zf^hRiX95O!H^D!!dz8fmi3JE1C`*-ZYYjFlGFK3Mcx28DA%iaDenUij1j^Np=kf$n zlBwm_b}Vi-i`F-)ZZfK6hq=wmvJ&z1%j!6RWlKWC4Q;bCbHM)FwOvU$}dOKda1Y zSSLNmF0DqBxeNRzV(1_I0bMH*2qDfh{|HgV2|oI5GyD|-;G1^C@gyIGdft5OiBX=r z(64U}P_F4W6PaKuRuTDN3VJK_dqYAY`jrhUCjYxFmlwEMHSnmXfKe|iqYfrU!w;WH z%nlfp`@IsgJrccU0fQju#XbQzr15`EyV+b;;e4Y5%)EWs?Bb|qC(UK2qqn=GM} zD!O6u8)gT6aFoeCPW&k+^`->HK@9Hzzp=d}6dIo~CmRQ9qotunhggDqv**x_&XYzf z?%y4YG)^|=goA*Ev_9?~BmyDJhg^ez!q&X%Sb|WRaMwts=^3tA!Tc+<53to@F$6^* zuEg)6i#C~R>wo`AAmVrqoZn2@CSW3vNn7GeIeqtFDQ%rm`NSwq(-b7k- z^2R>oWKgh({T2=P^&SijMZpu5g8w4G@T2Q7W(RD`U5D0$T~s3v7h$ZYyz8V5)Z!%( z@<&t5@#-9H>73QKG(FUkGgGc-Yv`l=I^{J1W}5mEZQ?gvf>42JqK#YAEdD-JRs^t71(68i+>R|m=FJ{Dso6k;(kDVSSYZU1*$egByq^xt8W`!g}J#D{?d ztpHlAtNWuIuGh1i2-{T>3SlzKSEzhf1+;lwG5LjJG8}EDDkeEJOpLPg6$7+9ryLlx z0)sYF0UKUvfdM%s-ijLz0KEmEon4PbTfhM)HuXa@)BmFc{CKJl(F&bUl52cta=38Y{x;4 zNpvlNnX<~9Hbcg@cx;SA1p){z;u9HaSc0YAcpueqimEfd2dsK~m6>@`et1-uGCM#u zyCYGS!55oEVMFWf^42siWpenzd@WLW+X;}JvnX$m_6?M`+cC8O)oS57n)l8|$d@;v zs53S!nun|&&F%gVpt;^4G{41`3ebFMGH4*f_$h=|i{>2!9iE!?%>G|e^UO~NQuAm< zb88>X&3+8c?{-=(nr}1v$Iu)B{sv4RF_7t*-hpU7KuaR!&1L06%^HMOOU)UpM|1a| zf+jC01Za*Nh~~zF(DW3|o*f;U|3GN9Xg)~L;hBC7vww`5#RX^<4@C2~W*{|B=0YXq z?d+qu&5xluYV~M-^7Eg7=8sVG1@#~g%`A@{C}>{A%7y852(6Zyrx0{_YQ}yFnmqAh$ ztwCiLy^OH@azNig$k}t-JIZt-qd4z?Wd zJxG^}K7Xx!K9_Y{a+cgRsLzKp+mREUP!}R^KaxW39(cPknDVyraojYF<1FAv6RUk! z)}8Wx*iM?0rL1i(gVD!*-Zo4{?=c&5E0e_9=BuG4h^SjY_vb6cqwKsjq(lyml&#V0 zeBYTdXy69o!Q?+N8OAp~XOP~&nq?4Nj8K75&MB|JFg;LlJxX!S0wFU5X?9gy-SXFG z|JJ&qg;@wQNet9jabiL?!5JD9v~P#>%ZJ4vAw&xIJhovTudDEPTde}ZF&kB27g`Qd zP(j}_%-+s|ZLeTj7360PT$rPIK<{|(`fXi@uR_QQjq51*f1-BsT!O8J|I7~f?|1Tj z@(d^X;+UEnktoWFIBbFb=t5we-~8GV3K?y_O#E6=_;iw>Fq}-hz-%iM_;n~`cx3_I zZN<)Tu_bQCK1rl$luul~X{rSO0mi#{K~FN1!^H{Ow9hjXI}@LZdXsd4kwf1+3gwuA z-yZv$d4mENioeM?PoiN8>7|-nLqcjkv z1Ou3gz11Xiai8HABcLIAiu$f((cS!_b4tx~MMcCev%4f#p-ryOrlMW%(rrLY83xq| z`Km-&lB`LiSo>wlmZJ%(S30_f7^=H5J79|&2F{Mol=~QgJzK=nLQ){L7t;fhX7={s zq|+u$7)!e;1QAc_{n;&v;@5sDGhlYpI#wV`D3*HfYOf{H`OpO7BUe+~SH%kU(I#^u zIaA{4nxFZp;asfJdQVVnGZj9TG9rz6P<^9Jueb|2F;qtuUDa)k;D!X9%hki zMzVAm!=_?V8@Tx?YeB;Pe)Z6V;tT_MEn&`7Kc|q42l(lO$p&>Yo@E0Vi*!G~X#&v} zHIg}yRRHWD{B|}&w9TQ=Gsy1|QP$nN%)voJkU|QQ;FXZ%DhOp9tewiCl{rMyoV*F# zp+RxVy|UN;o?;^9E#J~f@&~L_7TKAK zMjMJ!3p;7e9;fM0p=Mq6^~V{SvX%osd%VrxYSnmO(NdyqEJ4jd;LN@;x#7Q~Z@`sYVVitsi!LIALF z&ckfGHy!uUoDxQ}5@=$=(YKX3$p85G?v`VgZY?UywMms)d4z+KV`YTnMhhpNrP2kN_)tSILu6O@B{6oKdcWZ-R2$y3LK8@$g6Y?%)Ff&y zpQ6qG*RKTp=ci4`*LKXz7!8=2z2#z(WWV;o@U%(ddo4@x1G@nYK}k;KfXE`tb(iA_ zd0MZG3CQON0vGBd!tNc)R%+ZWmx^&mOXh-I_r>@CJGZq=J6CXm zQG?5AYvOWReQpF^+>+};3HX1p5JV>F{SBc4J64HfHB9|7?BxsT5l2w6s1GJLBzthIU^`Zf>9fR>!f9_k1t zLs04bLJ5V8O6@!(W9_?Tp>YENhVS?Vg^lLkVaL(UcZC34mOsi&lpi18)QJj6S)Eo&#jFve_5hFY)Px}4)XRb>hAmj`BWFXVCv3BKof(+l4 z1@aYXY~~KJj=js3C7f4%EAdXvx=^zWvNCr`5)>vr`4err!}bC{>`mrwmrGr|2K5O0 zm1EXDnw1mY^^d+_CKK;tV*R=KB1Y~H7nTJR%EP1y*G2uCSrDp<)8n#!z~!JQdQZi` zAjDs!UaZi2pD0CjNmsvlCccmypkY=g0}k zJ5sT$RP3@qVW<`G&WfGmb8cM-cxR*x;#RafkP&fn=LoP;A&cwD5Ww)_3y!20(xQGE zdnrkBEsC1CD^?d?9XN#tMmh3)uTDki?7L!EH`X>LyVU!ERmjMz`{ic_jO_6vVOiEY2ev z;SDaZWBJCeW6Kb-9rG{0$W0V<@3-2$P67|#y)?6j=-$O5n%+f996E)^AjXU8KnC4d zIWMPHOf3LAb2EV5J4mr_xkMZ80wC&jqc%HNS!W1Iiqs+A-dcqSZnoBL$E3@oNsiBQ zgU^p~%w#WjY2sFZWylLmoyXKBcS}+z+~5HD)i193vRAkiREOhTsqRXb=Bj&kx>1}_s8TcO)prQ#obXG zko^Vo*RU51^`&nTJLk#th42p@w59fGyPu z>ZAgGrNXOWFy);=6r?jJB4inB&DdA869*7v_)ctD*a@c>a*q)q&SmwP5=G4WW&_vQ zerCp-2I$o{CB}6+WUqoa384!G82JZ(|IRI2VU+0 zCW1&0;uq|E8p4Z*MvJOX#lIt}tNG|?wBcHRSOILQ6^v*dQN25V zMpjqxr>N$4s5`rP0BhHwhPV9Wt0ozg%=gI{9zP7&W4Jk?U^*WR4F()qq^@E%Ie|d< zof!U=9X+zo`{fu%!{a0rlFG`kwqNfaSzzr(py6pbj@g50>1deUN-$O*2E)f$h$pez zS~6r~k%TP6UeND2__Nzc29Al`8?XA@?g*tcr;h9-g2+Bjr5}~YedJYGt*)?CAJ1K~ z+ZR?n6d(vRwZsvqTtXoN%?5#5A#CZ!D!v2LK2d2@Lb&0r`_H37qwD~A%j~G=phB4u zGdpQKt-^sD$n~`?Mf{{&OVQl5@o%JhlU{D-A~>S@DEzxdbY34S?UmyYEKMe(f?hkh zXLd#;x^Vh@D5bP+WAPW7Qg%adOM?vgPW@Tg$$n;6i<7WOKlnq_Eob}U zPDuQ?Jt5I&k*>AwWbTwCXPGax2DsU`e0`2hh9YkTVppmG=*~cLMSXXp=^oeg?t&W5 zGI(CHx6Y3}0LbjY41Q}t?s-TQo<1Oi+yZPhc=?yM;_>S_K35`Sm5F-?tbons%I0lZ zV0bpK#cW8K#m}jg%w9@DpUrzKdad?@4vhBR#0d+iPf=KifZY=+!o1vYiOt<7$i=Qv zMkQp6=#?ij|CiHSbORdvm5&)TgY(T>MIu-6;4#`@w~3p#Dk+XJrDij{R5LjeDF(h+ z-!uylcSw7=z5_CD4EwUMuWepNqP<2Pr%aVFC8eKJP2w=bK4S9?W(s|_?k5Y(ABha; zAO~-<6c=rg*$+(z0>eGopka~cd?NZ#7O5e*#$&g#gttd%5T6@a_5M;-4aWu4VYxZG zA2X1g3>_dj6ckoIyHo^g1WyUD|Fw=2mMswSEkY`U7R=+IypAnd+) zo5(~H(vsc>Ym1m zIpTT*<2JZ2 zlo=6tpQ*gvnqb4vhNGDs2)i3W*@wA=4Tzron=WbF$z$37y5>9`b8f6hg?9KnmC$WeM<7s$%}aN9l%f91l`~`U74JH#(~|v3<~WJstK~s zGqpaRFY2AEQ^2vsj_cDA8qD>JlWCr zBEEo(Q_y}Pf*MGC6N4)nv+R8Y&{KVY0-30)?{TJ-YN>XA{|spxyR;NM1n#v(H*tww zu~It%vzz*9OhHrLA)_5N_Cv^@5bFq-T-+!`Y-qvHHA3`&%fYRab&2vYe*v~ zbv9{c()(-_Nz~BhGW@O!?Bg7Rev;jPvYS_Bs7QJH@Jrmhk^)c2puIs*N==;&B)HLq zCywSIDDStVF0VsD_Y^_u@ep0laHVybF5nO%JiCuPoN zZeh}|wLniadaYHlRuxKtbEFZTxL4(L89wq!@G+zk1?)Fkuhoi@B#J@4^*Ha&0O{FU zUsk_HRQ(H!_4%5dlL5CRhof%nY|uI7$;6UnIJCy{lsb`?)|ynT&?C~wV$zcX!^S&= zzIZ|bzY$aN4T&azzheXS@oooLZShDfg+9Qi>W>oo3TTaj_7wGg1S;F|7x)NrK;?S> z9AtG$n+?j-%CmrM9&3U`bQ-30O-&-TX>l31G|PaOO2zyaAQk$mSSa-hrYg!$v0g1^ zzNd?)CO@so5!7ZrlH_;>l@c@uq(XJ=9n|%V;24%W!dkgA5_EDW&s_O(Cof&W9*`Ck z0V{U`$BU$zYUK`B>gLIAE@r4u87p_;BrA7qkh`7M0Q#^)LItecwaMwUZ2ySdwE`?1 z0<&@#PO@^>3Phe{uN6Hjcdhm-So1CkvaIZ>viD`LEs(u*q3mUJJ4|HdSyU5>b_to4 z={hrI%tg!nnW-9HR8p*4i#cI@PKv>wLB+w`@(wJ!%^*k_F+y-u6tx9kDlGU9MCr8? zo%aCcQ!9TtsEs0L`r*3X7++aeyAsY7P#{AV-&DVeny zy>$ElPYJZ)S3;#yQi`VeHDiJ%UmXk~)1)0H&1?xAZV9#aTDVAangDiG*(Ute7YAmG zMde>oiZ&KTeWqBKj@W7_vH7n{eoc!TU$4S%zA^q?UF~-fIV$yqpay zqs2TZV3HY~HzrUSJp-zH`z@a+Z%9^ci&E=SY-jcM1iHhjrL>a-tCm_-Ew%Q_?x|AO zs-?D~-e<*D5J9qP39`%HxA*>D%?RNb`j#nF2-|k~%H=IVE36O*YZXFwfkMb?%uYm# ze4H^S5LO`woID9Fs9A;32;m&HhOo6RRK_ZVaFSIBbx;V4h+UVg)Iw#fPN;)UXbk2e zUC(vNOMf9?)eHkuRXNC$ZNN*`g-Tu34^o#?5z7O)wJM^qaC)lqRfIk>STI91TS^$@9$xIHgTEru z>(cgo-KT{PN#SVWs8m6ty&$1pd6P-&v17BYsCNptb2QP8O$ZIgW@GPvf?@mb0+eT) z3hr`ism~b3n&HG|hD=JfzvxDu9}gYJ#`AZRpdOLS&DY*YVWeUOpKY8GBw3B z|77Ht_oRBGxKz%>ukj5opqE4vwo6`d=wf)8Cs+oFuSz1e-S&826JB#rsmfWlbKKEY z>rE<~#d81h!D6w%0TwT3An$co=Vf`VlN$i$)wc!99Eh-pgq#9L0un(c4|e-|bn<&B zA-8j+8wo&dUtJ((-g5PBYwMK_0A)ZTghYZ!yu&tUX`4OhNDthL@z{4Pf|Gv!8=VHT z-J7f|&Aca7la-Z~KyYIw7j(Lkb>fRI9|uEx0&_fBnniNFtS$i#X3D#3uYmGY%N`<1tDI#jkV84 z)tfT?vQRqmN_1FfnRU5lH8Lss5Ee)EnKCgsYETP4QFPgpoOk2t25l;Rh5b$WRYt4> zY_x$laRF;rQt|ZF0^@y5YUy@VH?lLXn@yViy3#tsR<2uo=ik_!b?xql6_~XdUm>sOyb2FtiZ{2<*V{=(N;f_OEbYabl>QMQ2 z^(6e@zYc{r5OSiwd=@n;k5*7=`LvQ(ZZotN1)CwD;7p z={Otrlc0aL z6O8rF+BM7$I^jr>8^;DI#B(=6wnl^BemE~h`i{X@KDxPKGnc#IxeZyw{c^_u7c5Am zotU_h&6HnzFNk+<203bTZ{6!(;rjNOg#5k@@cG|L`}iDz>^7V2qt2S@^M60Hfdf$B zuj`{@T=ssXw@W6Sm=n=Mu%~Vh8yB#M+la(GdI@D9s~<4I(wp6rjZ$6;#|i}_1wLZG zqz$5s%RVF-j&b6<-KI%^jrZ$|rYUc<-{F;Cvg>|_{bQv@G~BY6_V*3KSj}$xn?|LP zglhIh%pO9se+H1wGW=t1o(y2^qCuR{>Hp}ji|1TA$pnNjyFeTP_qoFLxco09e|k=r z3um5j#u;4=m%!{p;0)MGb7%p6-HWdi;M5RGuz$bc=8JC7r`3Uz74z~9TextqGkwC*wKT++KlMmOc+-}lvZN|K;SP`4t z?g2I#wUBaqXg4x+_TrZYd5nv%1*dAd&DHH<^yT){QW<7Cb=&fp>%=t@3U$I~%ca_Z za|tj!TMlP-Ft@mlWcOyPprHJ6Quy~m@t4JWn~7iMWtwjga$&s%`j)ik>J(XTPE`SjO zVKUr|9z#Q_?3qZFEk2d&4+8vz{k0gVT2#%NqkgJ4<59L7AQ=mi5rdz5tW>9g&-Y&R;sH0%-5=)vur#mEg}u!z-vJK%?1|Yc0|uIu|i-awQ*- zyDZe=I)tr1x3#EuR}4dcF%iRP>&9Xt19tcPQ8mD?Kb=51IIMQIO=|k}!{!R6i6&7R>g2f9SivOq=&4}K83n3rj5+K~4 zNO{jP8_TC1Q5Ny?j-QbLZ*UV*2+&XVmnr+1Z`Ouo)VGg=o=E5gh0wD?(C<)Jr7C6# z5_l@&6kLO_IDk<1D50h@*AmKZIOI?-&C+Zl>21O65TU3mfcaR`55gkr44W2VnhZSe zD{0dE*dRr^|29H?_a~$K7|=CY6JJaWsWkXCEZ!9L{>Y+m4c-CaD;SoOh%Stj9`hl; ze4X;nV{+4+Qae1!ij?9i?8bElbAix>t%}5lKDWZ} zut;+70T*4S!zivOWsRGm|7K5a>m7#HJELeHKCfHxFj6`;VJk}&@^&WFX)8A%Y(_~d6-lPUdWo1; z1)Rf#HU&I~fbUQxq-wL~UvPQ?Dh9aWkEl#z{%kE5Ll{YW$q&3j?vY{@+aj*@Cls!f z30bXw9fVD-0D2J?q~&(pAQ=OQ&#~pG{X4U$&SV#%zexEjQ>4|AXq71sBL%{;JIi&& zN`7GDNdB89Z_eaoSI0W7sN@JCvp10~iwu_{Cae0hNEYAb8G}P{=w` zT&;ebr1&1TdVF^%#5d=GijW?d0%#vWU@}UQhzaywa%wTtMk`pxznA?FqRnpUx5A;N zsY<<uS>ap``UR zX>=$ls!8922Cl9WP5L~Pv_6tLxb)D~Mzdwm27a=5ykBIK$0Av`_s+oX3u!fuDRO6Q zhE3TJDd@wNp++`hQmW#$Wf*#;Kt_GJlFxRwQITzl6nyI8OrfTi&yiwq#qxghfg|r} z2>Il#gv?^8QA4w+d#aN80D=zh?6f7bfvly&k3Kp3%2Sr#uqwY*VF2%~5~oGODGe3= zji1VJ_nA<(MA=#OyiH(ZHVk|{W_rfWy94j)6o9!2IrASDerX(C=gA0FG(n* zq9%jVViLGdKBS;ZVGyCJhdE;ecQ6O~1Zv9-QtUm9Y-k!zuzGnJLa zGTv0>4`E{Vz9+0yxd}Efb2wU}cJGeVi18#*aNPb1$NP?>4D73Pgn|VhFTu?j2$;+d z`}rB5svA+cn4hX9EII>yt->k`Y_k)Ik@6~un6Tj>35D380&kJ+%ww)MtAreAMZbe# z%%My`vp!u)Ko<;a?xR9>bS2+!9tLTL0^uDHOkEd&hM4le-HYxY2#6uGqONvDq`IV| zH!nn z0CZe*T7Vyx=&8kG96hEl%^J`PBq>K?4gRp9^e*W{FT1{%eMBijBIf+iePh*&c2~`i z5Ex!BLZrDAosUi{VeWI4~4?0K+TZau{x-7-AHU z`&=;umxv+u6k;WHG9cl=cq;L0;*C?HEut!CdAS9sYA5oYPM|oTd|JcGQF1o z11!f~s4eHUWlTx2k~_5JytcdGB2^9k>*3(8Ay z{h&$0#<2P_&37oi>ThAcy34yK_lSHwDs=~M?JCi~#G1jKeV!i(BgV@!+FvjUPP6S8 z-u!PaW;OUu^E`MyPN9?$$QMn+)j0}&rUlV!$m?G5p6d1VBs|U&NZ}lSeg`7-?WY+# z*bE$Ur5eOnldE^Hr3d}n>&cpp6>5|#-X$HRhy&98YbzYkq7P^6k<&4-OuIaY?eT%lS>)qZG3%Glu~<&OiX9}r)* z4h!mw5iK!dsM3gWXxY^TM=lidb_UnZFquhhT(6z7NC)oH|HI}Bsz~rjnKMhA+9sWzRQS(cPs%? z6_revoryi^p^)_UV?vCRRjOiFgv~kd+NFGVMoz%$oZ`{)DrU_Y1*q|78d@!q~|esNWmY}T&xIt)EfF+c5#6nzO!z2 zl){W)jy@5+^-Gl{YnNL~HWgnEv(ucQ#CVk)rYbSZlo(GTL3gEcz!H}02<`?}JV3bd zgnQv#>HN)1NGs8OoXLcomN|iCUc_A1J3`Bhs;P)B z^maq?JgDpqkceh?X9;O`hE}m96UuH87MHS$B&(o;M6<=xY!N|3EXuS@{xu}b(lQ?+ zY^qo$rDaCeY>#$cBFLshb@@Bey(gHE)-r7@GXZ7#j+ef%zbjHlNW{s;a7JZC_9 zkIP?M^8Yvf0_$iEuuHJR`qTUcfu)e_9x>fpXXfx%_AtE)HLa>yz-S2i}80V_`KkqNFp;ny*eg5zH3sfzI&~TmN z9VVgBW(B9_kbPb;0sy+@v_RAy2ZrNPQSj;0OFKSi;{^Bpl6 za-e7xCo@b7Lf!--9kX24-jW4k>k$ho=Kdhohtd0>iC@H~gs)S5O-w!Y4~N`(0dkXG z4j~5|F;Q-cTBN$2SY2(nx-#?^iwA%1-2`3J{yr{hO#0jKQn*Un#r4g9w9&lZso#Bs zPSv?iosJmUIH*$<#Numo+3yso9+*{ObA#_s1rN-wCltn-GnBTLq`|~j!7M5F0;%J8jv~va>Z#+zh(M5X-RJ)voWY7$sMOQ z)wV6#2Prz0js6qNwXS$`5kwdtg;eh$fOO143%Um1twljN`4Cio0b-`8w6rEtUOSko z!ub~o(Fd=p|Fp!eV+HYQ&+LfL_WGn#2I}UVHK1q=lW+Kg=WsRpY(vM(+Oj6R!dv#D z6879Y#TLi1nnLA|ID_|%L- zZV~4wjl)Bhhw_pf>04itwc32&TLdjI) z=Fx%AW=`tmH}MUgY2la`_hv^AzG)3?Q7peX}^P~&q1 zL)AMjxnLa$607dMO%R?AgiE{)Z6Ux)&A_E3-c5`%c*tImh4k9-8El;W|0LS<9w8lC z`oBi1pKtpUNL4Zr=%1)%~)_pVtiOhX7@eG}KGP=QG>w zayk8uxqMd$3)1D+q#qMam^W8xfYOOS3{1Gahz{|#Wj!)ij+amfo5^hYeZ^*kVne|n z>NUj=o)c_zKOn$HeWidUeWuL%iUfw8_cy{ztM^GL)M_QhSUZ~OUZE{F5@2{b{7PHS zp#k<=RV4cVB;#~$+U9pr@UZxn&VCL|r zin}Yuj$64`1XFKwzw)sNS)qgo?4gye>RN53IcB@59V~xSF!x?VRdUM&?>`elkbeZB zp#Gz^{@Yexf8Buk-$Auq-UX;02EnQ>Z#F^*%mu@${Duw-8nUMv=WAoTtiG`g1~m4n zn5{TyNP2mx-241l*O^Zc3XR~9lg^de*0Tg1o*VZvJ0P5s;9L!sVi>F4?m`J}k7RVe z90%zuUlp06AmuI)K=FjkSl`173zDW5gD5c{;XNeeL?=foO%;za{=UXDh&M65RO9W4H!!|L<86rV z&iG$7-imlF8ssuXDpC24j5F}(;g%$9f3%9#&4q|`L~fIXM&A5Nvw#V*PGnZhWgV_rpa-({ zXI7od+EufFE3&p`R>ozOY8H@3*4oU9q-|R(djt*i23dJTI$|zsnP#DT$a;-gbuOz* zv(R5;En-&2Wj&x-AONy%lL)2;)yj1%C}r)rE<9JNy_1{ zr=(9Ydx$Z<69)#rR8apt>Au$dkJ-oA=NR+55Y;HH60oS*@cdOU^UY2h;mF+aui3g#_&1S<#d9+zz| z5BPC=d4S)Q$;ssb_W)LpjIgeF=3uE%ERt5aJP=(7i2^SumORn`OhOw4fB4)77lQ@a zhq!EhzhY-C@;23pd|sxGH5}?d+zUMesyNK$FEMMoDyF$KX*D{q)#-jVlvc|7DC5}k zmV|uv)XNR9c5y~YR*_ZRpD3#yCZM%yEUT0+dM)TWW(TBqbAn@4_IO1A!-W_2+U9Nn zU`@2Y+`F{ST@dWvM+uLt6AH?;&Xo&7Cx#NYr=(!5&1;R>lO>}HBM(fcqcl9(l`Yv* zBn#u``Imjc&CXJIkOYi?;G&9OND`vIghGI0hi-th>1W14JnSj+6W13fW#ODXRcput z)^~`%veQwwRze}_>L|1>U*9TaXA)@mk+>JL10i>m&7IDcL2>zYUa-8l0)JZ$P*PAZF) zD0%RqxQ>2S&aqZ~VYstLl8XHcI|B5VQ^kHW^J!rp2@aM40<}>P6&jjDyS1s#974jpfSoHr+ucz^*LD5cu@=LwjMr;*fd<-85mQzfMnNpAtOF-9dRP)TiX z6NE0_ic%YmJw*uy{FHcO?P)00_O73bZqM)Xd(w#WQS=5kwWre$1HICRw%XqF3!oa% zq1mTHr8;04K+En*?`XC7Kr)W7#^^QnnpO@~5M`(4+CK2>bXu_o**chkqrEWIh@NDL zv(<`ORN6E5B&Jx1EFf}>e<&5=;H6J|o@oH`j|{8IA>1rm3-y^29OWd|sO?`wjLZgq zLHAMGD!*(|-=7(!5*G?^_TWKkV`5wWfKN+N59$TG2G@x(sheKw*UP|c`&8Ez{b%JaGg@_9ql7`$Ux-$E5R{EZjvHL<_zURzosJRG_S8OHUm*2 z!5_8@OLFKs(Qquu^1KlEx1&#O@}V|O0rMosLiW~cu`G`Yu_Mr~K64rctRw@LsP`R@ z`m=P;2Vk28l&DJvAi5ms+nInrvo*^v{Xo^<3iB||a{qPtK(9`3Q+9-^!W$!@5Lsek z@!GkzR>`vbF(J!vW9KDi+fLdo<6IdrqC%Sz&(zTT&=mX2{ovlTBAuJSU%C*=vrGDx z2(M0MLJ9hjBY{K}{AELZvsm#&TaWyT4#j|kMT!358(sYBg*<#kKS?TByf&Mae5Dbb z3PGbUF7v(0v;=mm@lFXv=syb`tv*61w2OV&atZ+4juMo$P}74Lvx?|*3a zE7Z?}tQ{G2OK0g~u%Ggz4u{3;xLKeU07O9fmcqrIAlK~ZpsbeK0okUI0wEKBVUo2D+AuoWqu1*5F99qEuqYu(+C>_$T}nW- z3wkG$eI_s!=p<(TDV80^t6m=F6uo^8Pgc*!Bjy3)yr6fQ7-*DfT?_C zpc)SfNXmf%ho^JC)19rlUBL*imsrYY}Ne|1{;6olM9?9+7v*CW{n zWHGik!R>lPm8~6;x*pk-*}-^r)?OPOZNMtG9+ZG_ik(P|@}9ESAr7t0or zi$G?=sbMMk?KfcDZd#E+J?vJ_{y;#8!?jNqlweFIr?PCwi?cyU(O6(zE!682J`akOLUU&clHDz5F z#U@JCpbk9i_W3Pn)h@uq6yn>n@{oR;T1I@V!eaQi9LjlP9&&Ou8X+fFa@hr{4x0i= z+^hkKjLOxrzldCkC1m9)C#dNC(x;ehEg}3mxyl`(Btvbo^v+dE95w4Tgl@Bdi;I+3 z&+?>;cM(E9HiavQ8yV3e04 z7!k*4dK&4J^noIkIac#qh7c#+_Y1@+Q?N6532Ga(GdNRggUpEJ2=x zD1h*IIF&cH(ULECy}y^~!JG7;Bkkr0Inq8|=P%Ac(#@5mD<2Rh4@c5>nH`9rPtsp& zXBLCjv0KN40hu#iqd!b7&5Y^q`b9X001P zUcmIDh|U20k-5-skb50LYuKnUs`ea1&9SOR0&e!*g;8?S0>{du5pt|t9*h#Oa`Inf zbnHSoXs6y~gbTEZ<6P!czkJN8bt>i@lEWiB_oMyOY|=s#a+wgQOnYifYfMcqWnba?ExO2P!^0Mac)1KBq)4 zn!o!yG^^@0D<&_U0HO`e1cc00=&u|0*_*KPN~9{v?{)4=MUM#)^Kf4}0g2#EUQFzG z_GSUaegmcou3mrME|8`payz9SXPRw`N!S`dAabWfFt~JA9<@|r;K2#(HuTu+-YGmN zX1`?W`9T{CyQ_o_yB|_2y+NSid9jGu0WbQ|SD{*rzizL6CHX=ErM#=8P1NYs4c$7J z@r<^7N~q-?COKxP6vT#USxh^Cs)+}wsC-3;#@5&ITOTo~b@7fu8$Bzv`P@B0$A@Ts z3A2ajc!?zdf5o55Z1uX|{?#lbw7*uawb zKX(iKyLPncKgdA{uLYeT)6~^#Mz0a8;1?60$K;-=6t13lqlp>cw8$Fg#SyV|a znn@(RPtt;1PLe_s|4vBg%tL<69l~cJRCY2_A$d>8P;AF$|HSHY{yTRJ&I#%>k@|it z13m#z-^EBiu^JXq`-#!3Uqgxj=(yuyupR~IHY2VQ$cUS#u7>?~tbrGuk3#IJDS>@f zw+tQdu?|?r7l8jr;Cc&8Pg2FS-z58m)dgBF`;esN-5AN6qfy+~fd@&%YCY85i|a=s zEqc+n-)sc{eW8@zp%@oWU~Ki9duWtc>u7hP!g~@T`S;oyI!IK3T}H*5@=m|a3EBw~ z3JIDTarQBg)0Lll5Xc_p48hNhm>p($Iu0mcV3QnhJQt@C9+O5=~}vXztUTlbI_ zoB)AciA_as`^|djTkrO$7wu;b(00?&h5crU>S@r#O{G%PABL$ZZ=Qw{_t(C<%Nb8c zJNnI7>L-5=_i;LSn3|0FJ!`s=xB#cPr9~n|YuPSrn$XR@In35=QS`j(D`_PMeDUYE z^8VdJ_dI9DqLsegSVuyeVE;Nw5H=4K6taS#lzjKEs4wOHV!o4sV-d1S-~U zZ!iYy+9*lh4lHCZ-&rY0qd7`Jb0X=j%WTX_k`!pRv~10W;)k<{?AO`11XteW`q)V8 zs#4^ZTL|T5C!!mu@^qz?)y-l|zSfnqe(`MV&Wxx&IAKF`*Ri3Z>e9Yi8y;Cb)rN|z zkL)`W)uxYBRO)m=j=tr4A6HpQALX+A@6Yz8ZPw8?D-}s*q|B8zV}{M3UBJ4|({#7u zPTO6vI%I}d+C3;n%B6Kz%$VJ*HUzioGNiQHI9ypl^y z$fI<0-sQHL@fQd@63d&0M!@5a z;b=sZ94++w{nlFZUUn|v_dm~bo`1Bg_nn!wX3d&4Yu2opclO9r>IC&}4HE=+s@ugo&O| z*Bs@7qYz(y*jb4scq(xXZEyemY8xt8bZVFEPahWBFot?5Q#VV>`8jnDzo6^CapVq5 ztf#QKANEpR#BJ>OLj0deg<~uJNqGv*T-BJl*gHd?RDQZxU}}CEqWlbZh;Xo+|JB<> zTEiMGWrtUL5FjNuY~fO-(SZdk@t614UWH@+gJ!Rs6&y5s#iKi8H?0CiEurUd*#C~A zaOHt|v7a7{&lQWA(}hw?{D4M(pQDtjkq=Kh&@F7`!G?i|xm&HUmc^x%Q> zaldBT6)py=XX(8ly|^T&2S(*caRnC0BTYJgxt?}C*#A#Hfojisya>X>NETsPkNfY| z;}$u7zEX7o{bBTiY*5@rY<~Rt4)JQ_RsBC*t^D-kVPV`^aXXz7^=f8W%X&#dT2vZ* zMnl;$^S>T`S|wpxga!0A9pi2)?*EifGOu*_X4Z@aJcM_9P{owOi^WwApJrK!S<8iE~VtyTm`p{FV!Ji)gV ze9XynfJ41cHHG=bqx^&g9r`)N!9c8=0|EAd>wc)mK=EVriBaJ5r9_uRiB@SR3DHIp zEyVxxeXgYsJn$7Eym)PEJn^D9J|daQns*}+(K>e~M$VGh3a#xz^1TGrjG0p=BU_TN0h09s4rtSnt+N4`|^ZA5cOSr zm9c0+)U*6XFp3!oqSkW30ulw_jC@J$L!az0F^IZ!gstZ?j{n$GGm1CMJVj&4%Zv~R zh=YXbFy5ZxlESy85X#cxhYvd$vU=kT=;OujvT(3T-FHwqKLERkauh+>x;Yck_Z}_Q z!y*&ibayJk%^;DZ+~x265RuX15;wi?y-eo~9%2Ob)r5$C#P?wz4!7b?^QWbOGqo9g zJ<1o@7xO-h{ckj&yT3whJorT~^K^wc>);{qptq_O?0dhGAX)VluZdP`!&<6+H$D79 zy!<^*zv6f@{kr*aHXmmjuO{LA*Xjfu(vyw{tEDzM$+%E8?z;!6adOVcP7tXNBcJAh z68c^<^YPnQ^jM-xQuV0gH&~!xzk^)u!6VPrfehD%-_$H&18tI-@|F*oDCLkPRdP^F zpuR$5zDzG&@xKN9k!T+9Le(Rqx z$rdDuA(3jxfFTiK_)fu9NflIX1(9O$$}vP2{u`K9@-8W;QyXG~>Sz*&=wd&3lY>OaEp5|XP8>i-T)E8_i8is&%hMj<3EC(>a* z`Cw^>RY_>i@30v#-y{Daldlkw6uBt6Wg{0!#OYS}&;5-m!X$qWvthh#Y1vuXg z<18(nA%n%)E70&6d{Jo&f;^cXs(V5BWdY%T4+vwCUdw1ypJ*-TAe)DL;$QzjiFhK! zi^WH81M&Woec^vEMEu`C{I2n0y%HY=ar_H&{^n_k4;ODC@y3Ao_XFZkmB#Vn_#tw~ zO%U4%@%et{{nPP1R9ryPvjWmT2uRbe|B#Vmxgi_P~1(*n*+*X1yvFM49ewa_LpDNU%X!F_k%wEh3SvJ zZ#t3m7w3@vUpTSrXnC-N^9rSW6qNBVO!>s@(hx#wOs@Y8N^J{D{WM%^X|YjU z5H7g5uuzoO5apr(NJX&o`Kde+8Yvp(? zKEZ$o-D#h-Uh#E()?Uu_g*N(EiZ7EcH&^82L;G$4b8sR4_Wf`XI8nvZc=BBm@sGm$ z92OY3?#r^+SWT>{7aJEcJ6LS=cL^8jtD_fj1(0h3(t>3bRC#H!fs2J8g3^Dp;zAdk zqsj2c7*bhl%`;s4x65ju!o8a6frcGbU0{cn<x}q zn`If^&Dw%xxV(m!;TsNG7is&<1C{pO{1Iti|305#@j%DufsU6(7=FnO57Zy5!LMV> zkg{LVNm9Mfhu*`zaO* zM4h_7U&HL6zcq4saBtT)t3aDx8h%~&4RWTX|54V4tl~~wL&=6bhJ?Ggt}gyS0=^JJ z(7pY?W$}Xknzgu76u;~AVPvx2{{Pfc!n^kIFp}LO#PzZNZhdTLuMZdz>*FD`lN!?h zJEnKzJDPV?`mfwLgVPO7iqKyZ+pisGT zLx0ATTHJbeXvWC(*0Uo*!0ph+T}9fVz^t~4e$R50 z_5c>JU0`tF7VXk*7Mgm?wu#xnxNu$C6YA16wbG@7e^f?#iifxcg&J^hYQXyM@YN_L zrv6FVmB2m{f9bbBe|Pt9E~`Bn+Z~I|V$MV3_$7G!e9yTo`-G6>0(~>2mOCJ4Ab#)! z4CAYi?FRqglS&dzlVLe1*8ZTO9mJxSlKwEzNb|2!*va*adF9Nawh<%uHiq9a>~|Ag6a?LDGN znn9K0S8h{oN2!X#1#x~27UCZfwyI}gN4%mqPkalm`Qx9w$ua(6c?vO(WiGE7UUB~l z7QynKO6}quk87^n%Wr{$H=-W{Nv*(}U$`pNs-dr_EG}eyQ_Er&vjbTSe^Z>m_;25F z9=L!w(8O&I&GwrW-3!|_)CM#y4LcP9jhS=--?;7ThqnyI&voQNca#@IOs_<r-7`R#FvN)#{b3&z?6C+E6(5N^8fn)D~Z1l z3Cx#(^0D~OL`v0?B;ns<@o!6#=+PJVl4&p;za38x+}k4;IlHSOX_n$UDQ!9BKrNBu zZk^}DV&SDi0aS@+EN~8P7jFl_tdtnS^%YVClQ40)o0+=70l1_6~sBW-vB5j*}m|PCb@*m>$CDOD9(M4dk)5LgHax`@nJh=j~`Sb{6;FPF9Y^ ze}eZIeqRTVKaxiew^|M2iG;!O_|^CW-bWNK_hP9kAJ5|*`)BxXKK`;aZdZOe$``+K zIjmeho@L=eyp13qZF_1Ou{d3_`YSNSDto<4CDWP`!R8=v#J zBD)4Lx5RjHF6IHb`*|24u4l4y@!u2KS@`eM*pY8EUY~9|FLo^Pn272s@bweCqr=8K zFOULc=6pyL+?;6`-wI*O11g!YPR++Z8_GPzG7E{vd@_zyOc)3`cCzF{lFd#$?gh%2bKE~Wom`_Guv)k(vC7O;`j5!J#tVT4CJM)-RDj@?YAOXI6x*s{^s8|(Tz>?=193J`( zqoe?Tnipqr?0wo znCb?oS<ocie$XBor7VW1f~IPetGw4zCFcjKDDM-s?KN68 z(ZGQ-y`pXBAWelqRpY(EMtJTB1Y7QWtb!?-uneL{u9?@0F3_Yqs z!@!)SctKXaM|7QRiK$E+l?F?hpxk@Ix5F1cnOybS16O3#c{kJkvlhW^0xB~ z=y5N(A9=6J`-n7)bJZd=fyi($?yjBxAil(|EyQ26106i0pQe#^lrrue*`%m_GLD9y zLE0E_@ejC=S$99>UIg|}nt?qN)vLDL&sV1{=$Fl)092&#=U7GRx#BlK+%)&B70?h) z!)X8Bp%dl%H1vkonG`fFzSL?za?DyGcl?tcW`7P^e=-?!L%2T&tUo1<5o@naF^ z?)tWoz4`HKDqH>z`F)@K*W{;+@`vO%iSh@Bd3>&*KWr382yOC{CKuA7ejti}!3P!9 zem>UDv|mZ0u=YzWQMxXvlrEOf@LLWJIJ$f=x_ks(!K5nd{n?Q2gSGSTuFXSRsmO=4 zEvOfg7Cm+;gL;>7KNylSqTDkfG3y}v=_5>=m??7gD5k%KM6ZCxhlnaYPL82Ws{0`= z%P~V;pf9eRvqa=&peEvJIJ+LR0s6v8@1p_f~(}k&_E0$X=Y{<+rRhjaAJgG1W z$4b{FlM*8Nx^+s5Mm3gP)x;*IQ(WDbET?_-dE2RH!@Ik<(Mr zQ7x}K86RwfnMW6gIllfn^dvTuk|XJVMmtfMX&Vk8gAqoZC{JQvi9FV!lJU;zsA1EVy9%OW#Y zw5g9gBd;>2a`_N3vuFWJI}?a(dM}tZi#Siu52hpxYAG_KM@`arbdt5(o7~kk)ofE> z>Bh~{oi_-zMe~FdO`yv-H86mq)yUUa0f)HDkl~L$_<*x*h--w3$(9!69>0Wgw-X*R z$6yp3Qg-AOc7blQZGq7Pkyoh@7GWgMg|K*Zc2ADT1e4DGO17!{4uV+j^kWGIpJOAR zq)Oc^skC;xm~k#M%&@XJyj6G`ix_{pyNH;?tbF3}!n(&FN@{Y2C7+y66ye9rU}n)} zR$Jyt6Ep8FmM=&=-rfIv%{q7{B4fqw{!`#gv)>*nBA^Zr2*0Ok60g;PUOE%|F0xg5YUUedOsK>%+Q}3+tW?_io2zIYIZ*E*#P-jTY1{now7T z6yd;CN3YE>;XlH68)2vrSxPU4KJvhL_uePZ&7Q@!-1Fe?kG>XtF@G?>|6$BPoC67w z#6E^59po#&*zm8mA_eH0u4TBg+;^{(7SdQ%u;p`D=I-KUAt_cc>A}xPPGP^i6=)H& zFjxMo@`qbQBi2OY%<%Lfl*4T7 zjj|~i;rwl2)5r*OGN10(6q$aNSGs_XSIHE&-=$c4{9Zj)UB%uRjTe^-&u}^64*RZo z1v@-{hln}l`E%>@)NXZ$HO&Vu!-Bs6V}uR5(NI zFB9>zijvkj%mT1E3XBabLCOzTvCK@J;|IqAt&f_nRB&Dl`>sDbCE1T=3K4PQe@6G zCeWR(T*b&Es=G=LCPC(?$>-b{xaFKnsFqNqglU&4I_*~R$<6Kw~C?P?q5Ns;un!&vBXA_jn zytxZy=9MPs%RlBT>z|~wUWOMvl8iWnVZ?k`X6ttLz8Bz>v^zl4H|h3Q(UZh00}FZAcx+8d>*%kc`tJOBEduw=8!`C z9EXJ$rnxz41{{#1nD+UH-!e}Ol;3I}$qW=Ll%pYF@C*|qBIghVpV3Y(bg&O~Gr0G~ zA(1%gzEG_F|7;+K*y`679Oi4#f=Kn9ua<9`4qYI^VAX@_Mgd^hk_di5J;(lI_{Qe~ zQp1mx@Ba;X(U7{FV~Ef$zx7?ps_@s{zXpvO*tN%&W~EF&u|C4|qkMHtAC1WDXy>cI z^wHw*JYl*I4D_AI(q}k|#qz)?H~t5Rn?F|kHp@7jBBQq18fwbuxh73jM!0|9#cD>> zE#E_hx3-$x{l@SXUwkJ_KGEef>5aq}g}LqpAH6m{b|J2m>z!^F>k*n1I)2@I51+`g z4RD)8;JtuF3`c0Fxqc1r~KA;675*x0JRUWOCUcpI&{8N zen5xDt@_plRt}uV)&X>#$YLzOdt099%3OvX?2f z7}2Nh?7KxHqGHs-dt61Q+-^I>M!xNc*qgs8!Z4iDh!k*JBbEoVK@%e<$=tdH!c`Ni z=phr^BM!1(t_c5C9A!89CuF9Pjoo!)RMk8N)Pr4JYK_=oJmN|iy*WR6Zqn`_r z$v~t62{8$gIYMY5N2#w}g^o(s5f42EDe;1?pjzFG#m^a8&qQ_QIZF{|hK%)D7&NFG zbg&|M?cKTW1_C@3k(CLsE0P!$V6NFG3)^FEzn(#r?XQ#k?8!xPP;8is_XY|{Ie?x_ z($AoN>}4p|L6J9(v6BLs>g->BiyEXL9kO0f68~Z6S*KFlu9oh0DbN9Ry!@z99rJa) zC0O|&P^H1wS|uQKP@S&ZBvJca8YvlA1v^I<-Jp-M%$BB(o>lyi_wZz!z@!R1&Z`!ikWD#xh8*A= zAYBFy+^X_@&4v^VrA?Z`?QnPSiNOkamti&W)YBX=B@PiEtSx-B*axf-x9rTs@cg&E z>**6r>-=JkX)dSQ zBjQz8q4~Wa&Sws|BiT3E8wJzj=SVn2iRu<_54rHS!(d!DvoPjME^js;#&ZuBu<~PG z#RtyD+{Q{|I|j26XC&zonQLRYOD)$!r4w?qS#C`vx=Qm{of7PlY!E~c{3m#3I!T4o z?{Gp<{-fI>3=ts~Lg_F<_7d{jy|))TAGVt#^7D6djuc9Eb9S?5ZNUvTAV=BF(PT=6 z_CVkK-5iqC-5eoTvYW%)yzS;l<;r$+7m~X<=soH7BeI*rzGNrpZjO87ZcgH*(x$^` zlkMh&$VPS>%iV4cd$AY9ssO1V5UEagde4#W<^)tUFRT`xs)EgttMF=}9O03>IbV8- zX@(kQm^xVxNf4cknR<<>G*fmko|GL7 zX2}l5nA^eV3+-TFdQl;}Xv*Q4H=Sx`S9ILWoFLmXSY%p*4)|z_7v) z<83A7``<85@g#~i?}vYw(w#QFd2ioMXjb{H3v@0!3iG7LonOj?Zj4M&U}^=dabNi@ zkBYLy%d5|WroaVsnF~;oC(v-Nn_uZ;riKFH8Z7nep|mRWXqcnDRZP{%BVOCiT0 zI(K%G?t2s*X1MVaxpTDyTErjM175CJJYx1VFvoT!qz`~436d)WKDDHY8z7W#C zF4Q}QV#T}oUOb)j)mZ`;=tc3T+`3~BcNCMVuI-1h_fz%N#?SGkwK zpClbbEBf{H(>U_SW7$nUWwJiehjcj5@eRpSL+2+R&nF(k zryMXAFb5bVcNb6Z9!-hFlL2y4?onV>2X*IO~;9nQ2I&T!zWKne-OtDaJGPC z!o``4nxe^@QNhp*uvaYY-Ow-ENbioOA(e?eVqU2N_6xVwcT-@xC~;jxOpjCA3yh41 z36~aSl%t!u=rKtEKGP|G?T%Yj;QOjil@TR6NX0Ov5c51QoF{Yq(eMJJeBU!zx}YMQ z*EdyCr?Rja`r|vE@3$i?<@x<`7+HN)s>1(%LdRdir+0?V8n78gbi7{Okc8m z-(e7!u&Fp5ZslG|*fu0(m1Jjn49GI1AF{hn21h@;)BG0&Qs6ce(EgIpoJ{m#L11>! zD*dI?f1H8#`hlrGbGSv!4qI5ddQuNbT_KnvE@9XEUXV$c3n=GFae6Zsn#}1UN~o4B zqL|A?6rIpeGj_7c;by!R`I1N-XZ1J&Wx*WR!5(gZE=}XI>JO(&dnrX&hnb=Fs_uw* zLv@w!)9VbJwn(+Q#G(SS8szMMA>jIU@LXot;ABQV@x4Ogdy)0+Kw;g$LrF~z zt#9uuB<{oBQDNPEF0(pV-|`gTCpx6G3D?R}H2ZwFmpI_Jf}>BJu_+ZmVDSs{G07m%_7!rsRfA4NTD?MKN(xL?#e65DH!u zq^K~a6p@@0Sa%8siEA4MnSQ*tWBQpEz3WaxOfo-; zTLM@1sUbSE3@(Y^`Xo-tIKP#FA~`=h_E4LqtKX`zB^;gg)75V+O*g-FvSj$J(d5mj z;Boq`T$NnSj&lz1=$iQ@@HrC>nG z_hw0!^KLEJ5O075SAB8WNAR=U ziiwj&r-sxKP4prc|0rTzc}WbOxe&#~T#LaUF3n?g8iPL!g7_zHBV+JPC#i5cWAM`1 z%6~MN%@}-d5Q9H76a30bZQo(_szPdlqS&yBd{KcFA6I=~fS*pSgw&Y;VZefDI^w?k zih^X+WfT%6E+cbY+&#ogr8M zEphb@YR3zr@9G&zRODPej4g2}`NODqRwobHTr+4N!hN*!5#4ef6FTEXA*Iss-=V{O zHvv4uysW7O-}!;X5Mq5R}8xb=nhr9P=trxWaf$fZpY0c=bO;FU1t}+0p;^IcS#Qju@SkPra)E12@A|gAdY|Z z^yLnSF{m8=A&m-!&N!ABCLZ9BK*oI3kc>z4mRqwz$o5ht+DCr`AMG`va&)|Ww8v*5 z)F{a;F&A}`k0J>=V@*5?%;E9b@I;PSj_#|{FmzG)Ka4;PsFm;2ShPsutX;U~MFT6{ z{pF&%kBr-OV6sol4)8!0rL-^50e(AheN%3MzVh&2_ZULVybVQu3K$II*D3C}o8D1k zc;w@v*of$2@+*JmeL_-3#+Zg*2ZWB!X9MS!-_k1OrG$O3+K&>$YzfF6WrIxf;yLTxY(eF6hIQc1v#R5F2)Dg^X-5(47=B!))5D{WwJS68A{ z#q#}(&Vm9{DkOZ*w%+oo(o~sOrDaF8?S00t>C_R>Fik0GD7r>gj@k!7Lj^I~(7wP9 z9WgBMB~x!Ds^c??(D6fEz8i7M==|cBj~}P~9ExR6MHdbgZ^R{pC|)muFH445q7GPH-EPgHzlns>1;j^tAJb2rjTF1yp+;#r+@aM*{cU3?pl zQ)tL)WLQr3$uH=f+v#qJ@q|m|kb5!b>mvr}D=_-Ur9~$rw9BD7ZikxFf0P&7p+45% zMMkWZ%VkJ)z8nz`@(1hx7F1iDi>9er8dNcO2_CGdh>x>lhAE4SHEb zlfNBKcSqb$c@EK1{}f!C*pTQ8)S`_@Z3)CKr99yJQV~VAy4*KkH5z}+6flN$U9)s;1R;n zdKAR12nbotv>H$y4tSL$hO4FNn$)G30l%g@aRk9pVDtO$+o5v9cq^*P_2Kcb`yK#G zcC5|aJI{_j!&f_xEdy>h?gOVG!kQWzhB4XkHGCf7W<9PvwFgJogDcHO+SE;fJ1KT* z5QXutdX^2B0TJ{`F!?VtCI>i74%Wfu?;X06vMJ8}i_D+>G2Gj(M>}=#!L^y3^b`~| zM@LPO`%#aX5S&S*S)&Dj1URIRB}C|WSCNZ(A_ml-!+1iC{SFN0U z#|TaIjbh`Xq-&nFzi6}l3ED%$oE;a73u`lz{Yus&GL1qi~ot*|&IXhLe~6*H7R{#8Tz>{kAhXXZ%H8i;_bed^BD>`_IR5 zP2h2ix$c3P5T|L0Cdn~iOj<|%*O|f-^p=y&Dk_uHwZV~3=^dmGz6>nj%Zu{vPs1F^ z5rlmno*){?A%Fiv{~7E(Puz$eJP%N(U6_ldi9S})S1)4qfU6rLF0AZg5B(rHRgJFWRo?6fD*Y3QK^90we!dwb69yiAi_ zUt;jr&GJji2=Db@X9}x+UyjIefyk&5bSTUK_^>a7596^%$DNqG(Cm8Hf)U7u?T9~c zHd^I^FXj96-rV@VOR75HTnsUk?H}RS=FhytFWTQzZ3N z42e}p8D#{C7Du}T+8wW9{aEitcAJ7CQVE8|$zxmyxSgckBq814;trNF2W8~Ztz+3$ zE=8!K!&GANZ@g4`8IC~wetqmUGd(!61CDYb{sAOo4(Pzqrh&Wo9Y^u`ygOJO5`Ilq zjbfu$+C33Bfhk<9ito+vaAI^Bn(7;`?%{Eu4HV+lN)pqGBl+YnBP9PzW~TT#_*VJqX05%?SR>IcOCP4bkUSZ-*L zMUFWyxm{u!Zaayuh@6Q6TW{V;-K12rm9ZJ{IBw1a6fR|B=2eWh3>{ z5P1~geO(d0q(!Qvh^~%&aY>?1;~|j<2}!jL_5O-lsLd!mb=U8i`>o$Gqx#cg7dtzD z$6;<#bqm09@h25**?vtFe`N?WOPTP7B|&IwsC?h2rK|*Q5kTR!rFz~>7H+qOGR@N& zM4Rys2yC!SpdfAwi}L-I`prF(z!s;%M87(q>ubA{{qV^ISr%~`a3`&PJ)dWX0tbuZ ze>^US0?&}@<9XF&D(5@!IPzBwJO~zVMbxPlH0hFII+IP4*=N6)eTUabbH66I@#irU z(eUzpFVUTi(1kbh`w|*^W*_u{2wOM@&ot*!QoYSSkT{Y%w=ny|XNlu*6rB;18;)SU zx{)?Q>XW((+^_WS?!sA(*{vuJ>d|>0p}c+QS(4?BD4+3&pNNr1bW!$gQ&2w=rT%=S z9^HZg^#dX5d^YNQBy~EoZ2uA1&N+By`}=4|N2=iu6nlS98!J7~3y6Q!RgltQd*<#? zZ@enWTh#~&0Pjdr^yrwjHwk8)~+wiK1b^oVxbKp zDB(%S8Lb6-XK0bb;n5%)L+Gq(Pio=D5W9|Y*AFt>8#ji&S`^-U!29L2IfdEZe37&` z@@Y-^K8xV8(+-1B6&op4lzc9@5)^g|1q~pFMyXtU1p=BOaeVi!8hPXX&@0G|Qf7zA zEMv#gVA4253bS9T)Fp2+>N+*8s`TeAX?fM?&f>uDj-M#ri~pdC0Wc54$dflSb6iCa z*5>11dZ9F3@^m52)#iY$b5Md)6}>AMCr*rJF@vq1kxNb^kFwP|z&>%&d+hW`j@Dc2 z$L61QK?~tV%=G?E@=;ZM6`A1#wqI6w_?=xQ$fY&$=L@6pQwZD_bYv=ihGf`OTEcC- z_yVCglsgO4@XzqVKRkZbJ>q^tjB(R$9%dc@5rsi!AY51*|bK5`D= z=}{GribZAucVtg8I3Miie9-fl4H-MJ=WgVxu7XU(we?dlH^`~JY&%*nE|JU-c7VyH zurEC6n%Qg1MNo727H$C9lSH?s=S1a>lt~8J<0W>*KRrtJ>@cAi`U;_4axWMBDApOv zZ43%~U}W0D<@@-FvK(=pMWRy`H!k&vtCTF*Ras)p`%$GdSf`qa1#W}RtbD$RLih=b zflSG+`v|=7<)ijj{rz9R}jizy8I$PUF_Aoa+ z4SrD7%e5-uIaF2oKJLW^`XSV0l2WZ81A6loq&Cj6ki|8ZvjKs|!YIMZkj%b{L>iqoqILpL+Byrb18hzA9RzX+ zbqu2L51}#@>2e5l>|ACX5J?FZPqif;j~qfR%1w}(j75>$9(l40bRqMxhmx9E9UMZ{ zC|Hmwhfs@h2$flK2=y^{2z4;@k>wb-ei*}dF6khfQaCgOfUNwgrH}w$Lf2HuYoQLx zsX6$_vM_t!sqDisTNX(l?kvo1kEF5>w;~1fwHm{Rmm5ux!=_q|6=CP-qnxX76<3V> zL=BzNqkq8*wh{T3!=_`A!=@iZ4wqJh=mGZSAP$@IRS%mU7N3 zxgseQuhbYHOpX78O5Nd~<6?!mado#Z`nA7J5*CcRzn_hvfjY>eLb>9aeE&CKvto+- zl1D?hnEUW!VEnnSyzEDT6|ILjY@6cz7WaGk9YLI8v6DZATZmsBhw4au){Gh$xssx5 zwdf+hsGVR!G)b?>8kbb@2lE_2Hq~?)zqK(eg@i06!pR_*67et`x+GM~SCVr1)2DAu|bb z$h)ov@uNVpw6h}A8~fQT>WrR;V&Hcewmc@knlL;IPts2dM0rboOTl=74&?V9&*#R` z`Gvj5i+AIv>K?eaC;a#4dz<;UxcuCG>@xI6>%5`0`M1v-uRXZv-tT&`wFg&xn;_pb zZ+I;-i)-`QdFb-3^RPGf_|moWpI(`NW=;MtwRb-~b4~uo#XtWH`n>p|@2@ma;xuRsued9O5G{xgG-mj4fb7aOjF%e~8!%?-KM zthXuI*3sIKO?u6#w70&cZB2V7TehV>nay=r;_QqbjvO< zyd#;}n0#xlC7oyO18T?ZrdDZpo;zuo9N7^Q!Csxe0;X~;r|6G(4uN;PgxLBzXSlAVipX4_g#cbs_8 zz-61;TVNO(T3hSVsU7KtwuM%qftQuQy^&gS4mr6yxwmYxrZ{pAZrRk3xxrWBwp3F~ z^PUcv1<|X_|3kX!o)^lkMKdWQG=a*$OYQyQ85Uqn{#f&sJXe zwvOh#7tRN2vNe;Ou3RpYOr!fUD7_rT1B&*vz`Jnkh2DZvW|x;G+nbh$dg3Ey$Q-=* zVsFv^;9uFr7vulln)ddTCsT`u$zz%4y=w6#iRd)2US3;`U_r^(0xFYD;#&;tA@`Y_?ADwoYG0GG3y+VLNPt=wM5u3?VPo98s($SmwrT>mIK;ooWlW(#8y0 zRTikyx>OUD2F9@x%Cc!?I^D2mLvy`oPoOlJWL9$4!h&aaR${Jzt}GN~hpy81<)4Gp z;pzUIU3Ad%l;9RaI`a$$zmWb^qQ8T zf3lcS(}Aeb%U2|`UIROVU5hF`?b1}bC7JQ4XAO;64`v|Q(6|%!qY2Y;Qx4W}4_LJd zDY0tx@_gSJ`x`72}x`C?B`ht4HIlYiP&F zOK%N1C>Mt4)S-(mT)eSM*sH8dWhzl7pys{a ztC}B`D3QTtsqjTzS{5wv8SwRKON$JEnpDT0N?#MJ7J3sZTNFliOoRU@<^;3_OBQ-I zunlQ`hzV(D3x?Se*H-D;nw`nU8#tM`{&hOK$7^fIHtwXRc63m4{T@SM)3Pm1+q@O> zf>v*7S+r!^MD?MVpnO2`Cv0fjLYRs+xCbPx296~CDr|c5{evW|nv%venQdv$B|}A( zx>-e`-LO5C&O-Sc8!(kg6`c)ehtAAyrVde%2~m&&*@!VA^ZY{Q=~9bq0# zZGl*pD8puIsAVkW1m)K*b%zSMM^RFAR~X507vhbab#x%XbrWp@aVT;6B|)njTXRjx zCac(T*JLKj*k{eL0@mGQm@9N06u|KWM&6We!IBR}!}5SVko5m8dtjW~NPwWEc_Q@^ zD;L&nfWHYBc2)GS`L za#LXBnq_H`kSZ#DoJp*`=dDdOG-+pLR>Sk)=P0MNy+Z%Vc%F}i@@+tCPn5Tp|| zCmJY2ePWYWw{lbMiVOJP3zpMm585nLBNV&{0jiU)KV&3ibRsXI^k`FQeVS9b_9jfD z>8P$ZwKTO~Xez%j%n2w|HevzAmbN#|XIFzh)ymmkw!qka?z&Uouq&xLy(v|y(C06? z^!z1N^gpK;ShQOx5&v&fI+ygvL!cCsD1=JL??IWZI>l_FlfC9#YpX9PFO|#s{S!1G zGqDA(-xqqT8?dwsbE4K+x=3iDeznrg^m8EAW<*4E86rzzj}v7Es@9mbse%}(^bHLN zYM>+FDK;jt@Z?Im-il#rZfw9Jj598tT3cZo!)nT&bd_VSqDd6*7td=jr~0UKxp1CK z`^IH5xR6D%U{2H1CZa$XNdeI7_d0II~#H${T|haH?`c@kZyAA6og6@ zaahzMT@`V#_JBKEpG|gXOs%QXUa@|F%b4q67P`qzKxm#7z_`t1;Mrx@XkbLgzAI;L zQAGF`w)t@ktfE3z%a#pX{ivmyghhYyFX1(k4yGgTAgIeJNE9<376YaTBA{iS4z!?k zT8#746n#PlRRocGAd6h!o=hT%V5SNtDq)F(d25dGp-?AB*^Gz^m5VnW5@kuNWKsxA z*K^Afrh3c^7YQX}>tLv+R6$Fzv}S>~NE}eUFE@Ip@`qaKI}K z-@%%i6?1nqHqI?uyJr0x6C3TNX2ZI=Ygeybc}4w-xr;hA)4k6vp%`Uzw!J!dzQ;`k zEPva)CdgXNLlh%?+bu^;>WaG}1H;=q{Z}+lkZ|;_5Im~kDW!vWRS?J=~*t629 z%(E0OBPSq>f)XCQs1>WE-4}WDJu#4Nd(hUok~UXU*hj7#<^?a_qSmHX{HJZM;4SCa zyr?;yOm5FKl~A)(Ef`Q(F*iysLMesmTq%XvvczX)EJ6tpxe0_c?H^*OsUh9j(q7WC zwuZ)3X7{tvnJA}*7D_zSG9)}lDx7da635O#L%Jn%5qkZiOsC#sV!!56L z53h0$ujYfViyVh@S$wXi3f9opbkVC{DagB*zIsvccr72JcqseoS31N@M?<>tqPLgG zNa#zJE7!r%T1rV0I~rY?ww4YEJX#skT>f;zlZii*p*&@1Pc1ez3G(04_~`kbx`NkT zw>{U=+H^6kT~o4oapQH@dGyyx?M$1|au9K3@AW09-s@hM*s!{+ac2XX4>P`@zH(Qp z1)lZW5P`|&((T^dc{C1lmwS7IQZ;p(Co2ZIN;y(Q-OesM2>S@{kF#X36vKI$EFPt0mce`Ew{OOnjYAJtF(WYV-7W?bjbE}&)aGGBJ z9Q5A)cF#t-q`SDggWlGtz?|MW$o5ZDdsKXlY;80t6=EPHOZ6ta$gCoQa&mF-Vr!2B zrSreZXG(ew&q23u>R<_bFkP|hwR?! z_LVt|SnAt`n^(2?RcLHw<9zRus;Z^l%JwF#@G{=UTw6zT*=8ObScZH@bxTV2Uo+ci zJlf#OZdq;*mn>eqcpEH2%OYCAEsOEA&D&z94X$-)JpDj4(lp6XiTpnufi<2A4V7Sx z$*mN7-wyw&36%sb%773==o4@cN{CkOnl*K5n6ZB0E@a7HP%yMdX*DF%WgE1;@5F$ZhN;Q?yMtHobG&hG9Ey4n98U5H5ySTv;F0KjKaBA>SsD;~% z#K5N4qD4ECt)b>1lG&L-6)hQ$87#Gnr4Z@leyKIal}dV+E~iY;4^Hspzq18)AFKb4 zh76^MxB|svT4EiQo-kURo;rwrRfV(vIz4reT!ss{aqr;Ha3-GJIC0P#;FofE4({@E z^a0-x$)AJT6P5_z_;wKT4l*an$9Rb3yLrvQmUeVr3qm5Q$R6DFWEjEm>EPmUCZ65A z=HTMe0wv{NVebxZc~e6gi{>5My!8kSF+e2YJM<+S3)>9}PUlRtCk)MntBBi+gN!w0 zLIs>%beoB z6)WNRa1c)5^%$c*6Had&WWT1`{p^_I%fUuBQmlxh>mU{?O&GF10XHrj1b@5zOguO} zaPT!ZhI6qlwO0qlbcBjHy>{@1=o9)I+a=gj z35Ynq#lfbeb_|Tyr1TMpnwEa6p5}{`!HYYdR+>J6KST$3;>$1R+U4MmT#KK_hdK7< zU~+c{)F+A41V)K*^AM8jCkHu118GbgABg3Y4#`OU&M$E=vj?ZSc6&*#3t7&Pvecd0k;m41y*jt-(eKX0-JCpQOqRwc(3x*5g`49P)T(CZ=$8`F{IV4J-G z@@ooJ{M`Yv)~p!=Yi_4YB1v zy11KzQ`YZeL?4`8bx`XKyka+xI_Mk}2#&1M&&*=yx4C7<C51K=@Z#2%?H2lcZ^7jxEGSGRc~@rnTlrOj}f6y6t|^yEZ%Wl9TU-5_uxY#6nYZca zq?F^J$=RK9$k!(%LRiz@LTaWSe_mfLPnT^_cz2z`;x!7-*`m-9<-Syn&rK}$wzp`0 z!QcxFK5g*v>!SEFJRmlor%bxB37h>fcJxJycLwQnPA+GTs~XBG@7S5h!5_2as4B*u z>z~te2i=i%$WTuPn2er-yn(WzUhGXQv7tWZJhu(?HhUmn5BLa4yrCN!+G?H)8jHobA%<5Q`QV!xDA*G&&=j!MzOLjJmbAVJ2yk(MzXYNew&SF1`?>ML4hBrRy zRwC(G!b;&bl<a`F;TFcwtG`*J=W*Dk}g9JAXs(D-BNj&xkemM<2&)w4V^Wz z8E?gPXWqxhIs=NmVrsHXZiou2tP7@|>i5{(c7)8YsAKB7;k z9aC(;5|x$|GeOc@bE#}{O)~}FfO+dpJ8=pt$OU5v1NrQwlN~r+Aw2nM+0DyjBOic#o$xHCpS{)GrWPgO@U2x2slFkL|Kvik3`a8ztBp>=;2R8XFu2L!n+?9jVA~rS+GB02liOo$>oA)_E%Bdq z4SQm3Z$Op!Pb<=LJ7R71$&Ogt21H!i)~9yG+AdEvhO3VqHF|d#yvN`%gWogwpuwLS z{H4KRgTFQSdxL*8Xf^;A|JrMtAd$;1yDTPiJQvE1t%xLoHC^(_z>FzZz0y1Oy0mGz7V3b zVUDH0bxhs>0~%xO2Jsyd6*e^1(@2L5mY;eb+n#G?#Q^+=ljI=SjnfLC`D+@3}y4I3VPLJ1tnx(YwiIn=l56 zBP%v88t?|TTU%{q<%j$19brkZgcuS!9LqF}wP#zvMznF_%gZgv!N}yf%tM#SX&wo} zmc~K@YE%0+n4Gc=+cWq$NeAk*{)d$n_r*OYJ2C5GYS_eGgsErH>F7@7e>>jV_Uxo} z4_<59#9I-@+j5!g#$=>GJ6zUHX)HU9$Bhl0IBV^{ZrSEP0uAQYe?>tWaA>SUO|;{T z#SU>mq_!>FR`_`v8(Q#@t~fJ^-Hl1vsVQ}5m47k2<9M#DLNNT zSi68DlnX$^33@*ko4WtQr6zlJzO{oc{^82HbO+sf(dE0iu7isfxg3QK&%tHUY~Qzc z`P)kJmvQ?h4$fOrIq#B%-n>iadlm`{1>ZnxrqOedHZlC?>TytQWKhE4 zIanGG4NB_MIhNp{#uBl`u3_GV*#5Q?(mJ|boZmrbt4ry+cNZ6P@WO2uPEFh)g<$Fa zhFgroeoF*bLMQM|7Biv>yy^7XFG~aBzvv|Bze3aD@8#OsgAz!R@Km@AX91Zt{6u`2 z-qf0`P41RaQId>lUsptaI*2ARjSU@1St`ZW&tEC6K5^0X@VSp}-O}=<^`0<(T)DoI_ZiR9PhWnH{rUg* z_D>cFpdwE<4ny;cKOAah^wexzyE-!N>UELs7sIHr^_icPxd97J{|(`wE0Tza+z=!s zxmN^2K?YaAb!^R^5^{O5Vqs(0^Nq3~x0UAlvRElI!4-hHB324}c*)xT-w z;$k|qPd1r4I*zXiaNdNJe<)#wm3FXnes%MvgKx0{t;yXyjj~v+=k)#U%CcGR8TPYv zRj#=i4!cW&&)dp-N7mwVvmn(ehF?q*peGKG3UKY_O{=e6dhMzW>-=Py5L_AbIIOy@ z5W}pyGNnV9%q%95HPdu-tSrT2k62VS*3##+cf^-)mq|E< z87`O4;aHd<1<4Y_G8Q%SIqS#_biC7z$&f66N-Y%q#S&jOsz6{mIrwEMiAj57di;=G ziC_m4G8vIt@VQWv+5;x()Ey2#1gy{|_-{}negd%pflN8aC3+Jcsh}2>lG`_SkhjBx z*GbNgbFe<$7|!-(@A|-vPi(qyjhI=Chj3hGI{9+IUX1emr^pm^V$Ft_pI}~8ES9={ zr8K0=;I|FBbO(J*H3Y${ACvc!Y`bjoo}G^GP`~=b+V*JNu?B15?Fh>`sed7*eE-(q z=^grhp~3eVeAJ*R3IuUQO|CtiY&JsE@iXOmQP)OI$wurlx@O|Q!SDuq>5%vaAS~f|Y{7d0xJGn2Duy;XIjM{xchX0Gzy)phg{AcFL z_z&y|4s=N=A+ZjZezYvY4&)7TzL7gl2!3WH*pR`uDEz>g=L9y=3&-^8;j$YfHl%SE z2^#MX5>R5y1)I15LTI?Gdc>rxLW31H5+Suj%??mlomfl6wPlU`Js#{i zPBnsNBdi$i*b%C+7z~uVX3J|!;!Ki$brp!N4tt*sI9#9fuwso_5F9eH;Ou&SmLC=y ziXd`^4}guCYeEu*reY5Pd&1mI(`MS$2_lRVM)fOUWAwD18sT`3!D@ro8obfqeuF&* zKW^}d!S5RUnZZ$mvG*zc^9(LDxZL2?2KN}e)!<=+pEvjogFiC(m_c_g%EUe;p#3iW zS6bNRJ723bKm5+J{M)o)Ck!V3r0G3R zD%|`Rg%y8Qm@v5NDSf}m;PYZLPMUeLn;oUf$bV+oo0FM~dz@_P4%5xQ5#(uJvMp_x zTwgb>9n>*|;UrZfl_Y|< zwJ98$iY8sLF7(bvR;X1Qo?Crvf^WTkttHM2h+^{KMB%0!M2>OxNBkv|&2;lXXkNA{ zOYv>NlXdNY5pKMJwb&#h8Pmu=@3oZ?|xajsZxJtu`uMnk-SLJWix?a%tlJUqAo2>Sn}%9luIuuO?mYz zBPpv}Qw`aYQj%6uuAcpD?2;c{^jJbBvr@N#{C8|Q_?tiuEt9!o($tM0Cw@p!P$trn zH1%Jcu1vDaJ-ytg^t+5_^c~uWDH{K!>*JVlj#Ka+ZEJI8vbHu)+SX=VNLkX>=1kC5 z>W-@h?9dG;VTO`-1Hnp06t?8$W%lkMy^JjUU3`_>(3qs>>ox3x41*b3^U^H#dL6Le8qC}jDy~m zFtv&2+5L++qs69tbMuyi2ni*_h24DSU^8#i2o-RAIS4l(^5@bW>@3N5^QVKI@D;*; zF5N-;65&5b*TIHpcDSfK*L|!;V28mTgM9`E4NgF`1lMm4Zdr-1d(v`qCC?JWzuhL@ zw(EVjZ{c8xx=pBtm;3Y2!TL2kacEFp?;Cm^2W#%I=H%ia z@K@I*fR1y~JFzfmX;goH5>(;*Y~$ZSwtwx~fPE}y_(gWAeF_4e;X4TYRh#Pr{AX$Y zB;U8_m*5%PkK52%7IS``gR&pyDns4w+`WUmv4&S2rny)`zWc7nL9a#EnA#m&qNC6> ze=o8;2e({NgA3+T*rLa>s|}yRImMfThVx4tEE58$#>QMn3%*i&RvNBe2NhqZ2y8F4 z<0j!LYSv_j=U^D0mxw+azT4MxQ1Kgiz#1PZK*!}M$JA8Zccl(0ep|zCe9?s)MRwwr zz-e3H<{bwW|3+L|iM_Rk#+K}}bby;T91QB$HehR;TiQ5FI5`{6FLf}$w?3E>Q{`V_ zz2hKGyR_<39bVleO?P(J!SiTpYw*#`Xnb6HXzWH@_6Y)$8EfN(#7kIk?b^7I1hD?u}+o z;D1X=zUvnU;r~QRxO4|`flwsh@#Wyc5{Jj}BxOrlxCZHo2T!dj@{RN?pIWM2prMGA!?N zjQR$jl^AL?e2g%_2Ad4lCH-BITnDs28DdF{O+9RlW5-&Fk4pRo?P$bFMPFKNcoy-k zY{#`uI~cs1$omX#h1Vux0}Ue<-ku%oe)EeA~i|_W^r_69f zum{K)DI_?P)8$EiNac#z#3fOCUnVYblPiT=w>vj%zuvvdotRbu4^bN5n8eU6SOj8S z3LT$Lzkz`jVR(EfvLlt@*<)Uc4Qeh8(Is?9x1fwjqZNF)Anj%)L^-WjQ8c3D@9v40!cB1jehF z{UuqnG``X?N^qMT8#@}&>#0Wf8tx@NUoq7;H^wpcoHP!j>cS64&~A3c1+7i73vdKh z8N@v^xbYfy{W4(f;fSdogynMHNEbZRDWT@ zkU!$|uD7HEU;Rq$LKVSAaZYh0Ho4pRtJ`_CVa7k+w{_+w8a^5i7}u+DA6Lj?A!QT2;!qNHR$*W`05|RF@C_HfXTdfDHooNC zuOkS}LkFPiVD@(S%HiuH4IAuOJa{dNW3kGTVLh$g!i5?rCw42g z{*$W&VbSgX7<71^;X61Loij@4|LmWpudn%2)8|iB&vQ+8{7xpp(6q#FXdzkjunBjv z@|Y&u<;r%a6gqHaF8|~aZAa7R{xRtAmKlEc|0A7$wBG-z@{V7VS0Is)a4|48w{zLF zwq-kaf~knp&9_Z^+8OtZd`}D-yt30#a0b%7TlFXf(^ZFGaah^ZK%} zvRrhQ??{WucKyu)b@)&cmN0gKZ_t>EksE5TrG(LRlR+&Yv%|9=-xKXQ-`Zhvtj8(T zR!-dukE%Ys>faRJWYDEQSNQv{EBG5-t*UtuhANnB|hEW`0-kuQPau!8!k~>2Edo?*fz7N z!EMw0jR-9t$-$X|vu7?p6PH(1K0z2)jN)# z=mUJsf#W9znGQGxIODy?PgEcPx~K>EfbAauKHzO11U_KJA>ad^`Vrs*zW$@Y2Rv~E z_<+0q1^5UczU5262fU&m_<&!%8~A|V{~quG{|49xIOqGo2fQ6{4Dh}m03QLoLq7yQ z;MNC$5BM9v4#37A0Uz)|z&^l}e++!U!#@E&-~&GeJ_3l#@Kc9XfVTtI0dD&_@ByEX z-zn??{3>7{;AQwJ(m}v8@NfaUlV;R*!s-Y^V&z<BAAMjIv6$s#FMt~3arQZV|@ZFCCAMn-x1$@Ad`~moY=l>D-fVck% z_<*l`0{A#c@*jT&KH%CXfe-jKzz)DIe*r$=>3;=2VBsm?1Ab&2_<-O48}Jc;ee& zRy=*84zS~ePoL-jyyHbrpXdQ>IScrJAAK?K0Z*F)e8B4fE6$F^eo+T}z~g{*fNfU- zA8_qP-~;Zh2R`5*00#kIu^IS)?**(t0QTCefDgF!O~40y-POPc{5)U};IcOZAMjh( z03YyQw*VjTwOfIY4btyz13uvQuLV9}RRiz=XKx2S;QfGofUj=?KHy`3V}KXk0DOGl z)&*DvxTh8PfWHRp0NmCFe83+7_5s$m10V3+9l!_t8(;-CXd2%Ne8BEB@Bx3*34Fl! z?*=~L^?QI1IJg)1fUP$HA8`K7!1o~U{lEuYeGBjbzn%v^VE!QR0Z(}k@Bz014gx*~ zI0pFl4*>r>;C~SKfIkPU1H9r8@B!;S1bo149|k_)C5M3zcKH%M-20q|5 zp9MZ(A7CHgnV$nb;CBGW0B`s_@aM&1KL)G4)6hY z0rmji4%i1c4mb!{cR%m}KRWt$;m%9|r6Lyc=*3@L#?M ze89@@10Rv_7yJPDfbaSt@BtqM>;U}YAn*ZWKLtKu zz?c6L_<%2d82Ers0rmhc`W5g2-w8MfcpPvH@Zf&{e?csE1h5Kl)~|sNxB{>Pa3^37 z-~+?J2YlIYfDbrx4ETT_eFFFk(I0;XKHwLg0zP2bIPd{K@ZZ1(jQ<_@fX@I90{;Fu z@BvSL2Kb9&u?2utfNwtme86n%nG+p=?*;4u{MC$SPV@m@kJ~l|0r&r3_TD=_uHtGR zAISv+mMvq70Rb|_5QH&dAn%1NgB(2>`jCr{hCbv^A-f?@$bmlOMY+(2yfFa%e2iC+Igk?ypbr@< zhCbv|kR6ayj)gwt!sDS2`8s4DJgFa+8WHaP~a_B?8 z3fT=g<#gynZh-8AJZuT{i_z~u=0IjfpbxngvKew%1@s}$hwO%2R0(~^B~{Re+ya?d z0{^R_57`e{2H9EzeaJ_n(1+Z=7W$ASOQ8?>Fk~O(M|IFY2IW!@eaP$1fIei}GU!8| z4cP(N2iXm|rUCkp!yBOw*$tU_Ec(YL=tHiKK_4=^8TydVL3ThkEr&kj9&zYH_CWSQ zRwtkzM0;<6KIDUtWssvOs?E`~nj^h=-*x$sixLq;!yKIG)fp$~ZrWTuCH z{|e|s7IZ)#a?zF0hdkzL=tC~O7W$CWuY*41aW_C8@}wJ~A5!X++o2D+;ZEp7=G_B* z$Oj=iAfLV$`jB1sK_BwUUqBynd^hyNnBP4JeaK@Uf^da|u2KtcK zKz2iJgWLp}_bl`wFMJOA)6ic+=0IjW4}Hig$Y#j9AUhyGg6xJo=J(Kt?11cpd;l_Y zI-U`F0s4?Xei8bR9gxkCm4ARfJ{~ze7 z^~3NZG$wOxdTGW;#upAlihAe}Prb0q(0n=Iwj58@Lk^|i2KZy}4?6fx;Olce^})_b z`ZLZKZ?tbckSmY%RFeQh_}2^gWANqT^bmZ%z+q1viR>&jQ|9>Zy?H`oZ5n%~QD! z{c_;%PxsVvm>Eo*e zNxuzzM!SbU!a*3Kd^*7&1Ac!8-vfRz_)8spFZeB@@9?i5{P6QU^@>A33;Faq_~#t@ zLGYaycrxW~F;4gL9?*V_#PdxQU zhkh^k*&UurM>!8wzxu(Se3hq;b=c2BySe0QPo3-FgWz|))>9)Kd^z~c^`82%gKqKuoEJ>Xxw z$5Ue*d@uO7@AXu`kw5+5Gw%1)p$`45QP^{Tz*Dz6{11YE1ALJ~zZ`tVgPuCX!MB0W zdkF2zF}`<#fB3hay1}8}1Af+Ho_aBvpSojy&Ic962~WM|xV|j- zRsW=?mN@JO!9VvD#>Zq{Y$3?_Rt~=V8Bfi2@NM9~d)8C;CHtqfjeaNiyMOQQzk9&H z^Mbqo?gf9+i=IsVhVK8scY$Any^*2%$E;oOcM-!w=5IQN7@vdSgW#7t?8^~TzX1Qf zgKqVzr6jH^G{Otu_J1XRCpZ(xp2EWPSUl!&qx9l8J-#Pdo z_|9EIYI8E5RR7Asx9u8oj_+;Y{|3GzSzo>*Nd4&qzh-pEIsWv3|93`6Z4-qd%BL6n zmt#U|orCWOzj|y)UG2!ftkGCoj0@o}i-)!!1fMZJ$MtoBzvoEg zFXm}Oq#kqd{ov~ZAvHbOe$w@2jYa=m98zzH!6C{o z2!3rzNHt>~JrrLKep@i4UUTqm;D3+zXSwP}C-~_hcm3=E-wEE;zI(wR91f|ylFMg$ z()thlvC~7U)p31UnYe!N^$tD=e(xFX`c)48BJevq^1lsy$IOt*aPXbrZ$2@kUU#J5 z13rEd`X`5eFZjePs&v%zkFZjQJZ*u7OgI~BHq`Dn^)^50$xG z@8HY9r!5XS=WlJ`Z#>nVKb_$Fz}F=AZ{jP0wC^793(DR3-wS@k>F)8NAN;-GUG+O_ zJod+ygw#q$`a$rQR-k=5_;T<|szYi~a{r>eH~zPQe`G28C&6t0lGOinf?rO<=BWcx|!_k;g0@THFO%fjYh!LpD#!=WDpe+zh5`zZ&%pdqC0cGzzN z|6QZI{5rwk-xN}DNBTYBvt#IA9Qof1{zuD0D&f%Y2j2;Pxr5Kz1M{1BNWJXfgW!9? zpXuPs!Jm={smmOE8~82Yk8tEqC-^a~ZvT70p9}t0hy7mg2d!|IUqATE!C&Ig&)O5~ zrsN)G`*&^NH-JCNq2CF93;2Z&z6X5qYB%2tz61OsNB!sr z|H+x|^-b1Z=s(&*>M%$8LGVX`Kh(jOgI@rCv4d{|e;@cG9DFDEH^Cq7;CsNQofT4_ zC0}3C{I(bT=jXWRkNx25+C%EE4*OXXl$v{PNUe6%&mj00&I_qi9s1?q4?5pnf7-x* z27Z3>{6uUa==BeH@8XbiebEE{wo5{4Zu0dTbu<41|J7w7b(dhae@){1!FOIBQZpQU z*50`H2;MdS4uW5Dg?oKa4*ry%_|}I>>9>I|>IkVqNBW)M8^Js4KlmrXyZq|~AG|W8 zu5{S%2mc4~`#SineQ=Kre1(G#f}e3!NEJBva`0z?ch&DU@OOc)bkwg-@H<}QEu^k<)Q^7f@7x|zCp*&5LdN{)&X9V_F@Fz&|NA{y|2X_B z2Y=$dA$76CejE7L?!)-z;5)%jz29BGdcYt5KuG=Fk$x}u!@EOjABX*Z@KYXi_g`6P zgv-Fsb?67d_dFC*Upvw-2mi>!?)udR{$=oU9QHfG@Aqg(UGCs}z~8gMZNC@%GvMEK z_}35q)?d2oXV!jbAK+^o^S2=Q+@6q%I{YgKzy7h1>T>XH;0u3;`seVk6a0nXCpq+c zz~8$uNyH*8aHn{!~a^;oyVdFMKAXraJsD2mb>2^BsH} z_}S08^*g~|1^z&Xeh>IZ!2ikNUoZG|&!hf2^!vfT4gQx7KI;I?AAawi-vz<%`a(!$ zInpl&f9Q+u{kb;q`@IBxNB`6bzT}S~b&A8k9`GIDpH1$clGYEs;1|7$^{c~vzu14> zy}rxJ#xpf-7#od2q9f*lN7jH%Vbl8`7rabVed;D$#KkV<=-%cOeekb?~J`bsJ4*Naeul+Kl+8zG&g5Tr6 zLh1wu-w%EP__Yo`>mcM0_|qNv8w6kURY+a$@UI;F%l~q(Z`#23gFnMzzY~1jHzDWq z1wG(D`vJZeeEeIiztVAmLzG`X_>O*DpX>S$hJEl8lJ%43S3&S2w!8Ny%E2eVU+b{n z27Z(ZJNZuVH-m3===Xr%EiLRUzh3aygTE;`f0O+02cJL8&1W5gXLW~%o%dgY;7=YI zc0Qj`4*tBI!p{ArHt?T<|Hg5Bo!~zj6;}5<_#W_A?HqRAfA0k!+coUGKhh6=kI`Z0 z{gff5HC)e6B;kAN;{tVfX&uk1)P~ckRyy z!N0j**ttJi4nDO150pRn$HBYyH#@=S91wQy&-H-+%@6Rs;HPAVo%av=!S{jR-;qCA z*mxRqpu2tq!T%ckov!i+UvZF|Zv(&6!EU}2{QW<`_kdq`h+DrGeE$#d{orq#m(NSTwK6(BiX(7n?(FXqSM~79v z07Hxqo#40TxbwdU{7-Vj>LN$_z2NuE4?CZ4?Fauo_*)(6XJKQyD-d?>?+3x}TM%~c z@0WwW6TIvGLL2xAg<zf*?#cztHWxM zBmJygJbzacR-H7_*upb1!4SbJ-F9-inlY9Qr27XB_tnPN`cY@!k z8THTMUk~`&srIk`y*}O z9|MnN_|WAKelvJX(}v`G!0)^w?7V-}3;qP~80Lr6?+1Sdcx(d>$!7)dd<*!9gAan= z3jW^?z8w6PmG1i227bvZ_xRQc{!iem9QJ#_7p@NLze5_T{q%y5gP-rHKmFjJSrb;% z9rm+uV{7!8VO8efgW$`-Pjm3);BWl_z770V@Ii-uC-{Tg&_6l&9`I{^fbRvr3B0R( z`@w$!zS&_v3pXYsXN8@A9}xt934oSl^#9AY{XqX$jORBm2|NFOA_)Eg@GD%`5B`u#QGO1- z4g8(pH#qoC@TXrEc0OOw1AYVe3Wt6#_&qOo?=SR&KL>n`LqDqo{TKL09efb{^;fvZ zuX6CApJ4s&m_N0FfAPw&y4YdA6a0d!!s-@B`SpPR$JOD~zfTZb2wC{w3x4jkVfX!i z@E?NzMihpae`FnlzwuumRv8ZegW$JbAI2W-(E8=zFTBCMf6)eh?2Tb{o#XmC!QXLH zSncKDd%!=|8Fv2tW-s`^-i-P;Vrc*R!7sZltQI@2FY8#WpKkww`VW5Y9bt8v!@qLy z_uUyz{reQjD+DQ@Ht;L&cK45+;Ah;6^_3_LQ9eE3?+1UNBmG|Ro9=V(ul9qV^9whh zg@NfM@a>NDgWzY~@1CERgFoy6j9hMusx#*she;E#IDU4PoZ{}#Nfd^^EUeB8ah z>;WJCU06No@V^)Q@F&CSZw~+Z!G8{Zr6Yf`j>kJDo<{%bupb2f%(K}488vkNl!IUV za#(%pu-^v0^cBpX9egMFNw1-OI`|&&Xa6aze(kuvUhqY)yZ6uf!7l`lZIB_`SJnx* ze*^w@NBTkVhrJnA%N+XU;I9VX=-}JHtG7^o4!#roli+W6@IBy{z8zM-b(Bvp_yc>x z>Jf+k{ovnt7yDlhKFhBKg8$+( z?2qpR14H$H;4A-$`)@lB&G&-8=KHYv+M(YM{<4v!YKbHNvO@U#tWl-vxzR)04}yPi zk5aW}*zmwz<+RPsoKkNeZAnno?NQ_ zl{vJ3{oubiq11VQAS;afdtRxU3H71!KM4LK@CQ5ia`2-Uu?!p1ekb@< z;9cw29`Lt;FLmhmg8u}(YyI30er&kZoP9Jz{X)^HtRLWm;C}@Epyc$Ep1&yvKMTBM z|4{kY2EH8pWe&a*{8sS$4#Dp(7=nFo$G&`Thu~TGzZvf^NtXx=Qbv-`Zvofy%@co; zzIJ5o81MX@t{8Ut@XKV1Bti7c@!vZZ?-~(+LGTv*F9tr=g8z~K$$|gmz<+Y!KRNKf zmIK=vYy$q@7Ej|Bzr-yb9V~t`f6J6c!s2~BEi?2d#_K5{4VCF${J?A$P`b)1S8ZQlvXgB+B&vILw4+1Cu<7?8Gj_m zR7b*IMyO4@dHS2h*YP*i%-?n(hD;G9*z~{OZm#Dr#z(&D>$BOA58Td?-+JygUI1;eFWpXus;Yn)zPuG9TJt*4$_kzX?>`Y1P`nz+wt+2y(Njs_a zxTAAUN>777c*B8hf5RrEos>SpV73hoJ2)+UIG_vu*F2O`riZp6?=#?6Uh7Ao=EN(*GyfI7Dq9NTeDk{Hcam(^8$B{xZNxvPp$1 z1*?O9U1bX*!G6%@e69LXTRYZ zqVZ-mxhd8Xog50!JgTK~shYgBsdciPq^Kt2yf!EsiGxZtV-KuM{t*Eek2X|_0>3pk zw5Z9FKWcId&Ye_~Yw-hIOiqzjlcRN!+IVGSG*XAt+y;KB$<-~fcmfF;aYi*r*sN@< zuSV)In8C+nZQIzXN+5Q1tg#ViMj>jnskQXe%hR`k#2)+!i?4*affs*PE$vZ^W` zU15JU)Hg-#cVvoeY@T+1vV^MpZf+g^uvYNvlcQb`14Oj zR#~Il^zFL5W}H#lNL}lWjc4Uz@UrH&zwNsJu-%Me1@*;$iDUgIte>%$ytMjupJ5&K zXE35o-|E}zUk*N5-|kz;`Ct<4K8NVb{KT(+CNRkpyU$|#qs98>z>a+lMA5;PyZtTC z=p^ggeyExH8?ED1u=<(&eXdVGXQHQ>oQWpFTL-2Vpw%-ho>Rt`PhR z2lk&Va5?pD{@dACHud+{yEitrQrSDc>TlQLQ_{Ek-ovFD_Z~Ls%h_Z2S_owIoy%G9S_pJYRpDLUB8zplPZ2h$Q_PS)YDN(HcX72NC9&7x!@x_J&``gMt z0!!An`-EGm-)9R}YY*0c)2IK|ZYKZV+RdbI_ZO)?kiPx>F20B_)_*nL=>MJiqh{Ec zMrNn}R3G9uvnYkJ`tbq7hW5w()S+Lor}4id#VYn`eZRkT==V|o5MO+M`nv$|W1_Oh zUMBrFeWdTFeg}mg6aBwWF#5jcJ1DJ#p*)oSX?q*}xjxeOQ{_-UM-oj6_w8f!?@Yqv ztJSyiSnB(tsfvA#{{LJ4OZVa{Vr{CA`ZH}pOu+Y3`{S$PI%d0mI0^T4YmMT;5Is<~ z?Z%EjGCU8J{^HAx|BGdUkre#tCsBjG4uf~a>D~}{I_5V+;ll>*De0E&^uh(`k`QdNzPW&*&mv;>b z-c8*4d5E=7yqobS6YrX4>}L}%BEFHhweJzfJs2I+;xax-x*lq^{T01`cM&j+nrTiq^X7Lk^ zoo@V=a3ArUSq8WH|0wYa;@LVj{=VPZAzn=UIpQ0Ab~X{;Ogv|-QFxnpwmejZVC{TJ zyn^@)6J0-ZEBU{XxGl%87+;-k?AUz!j=1N;M`F?;cG`(^x~9ew@2X7oX9Drf#M|l5 zMB)`yCcgFOaBGKnHsj|L-{^}UB;H5d=KoaUnbpR=#pe+Bh+F%o5U(I^^Rt3@m(NZ; z@r^z_PJFY^&Y8rsYm7fO-3y3&#I2u~6R#lN&U{#J?fc^2LR>|SeOr!qS^LCoK0ipj zow)VqH^jSq@t-2TiMaLiCE|TP{B`1)wW<049&wMj{#y%N+h2%x)uqOlb)2rZKKvWv zn|*ltFcV+Zr`p+-c(xDUow(=2_ak26!zU4M_u)qq?;>vVxtRDSU;Gg9J|BJ}@$557 zb&1=0IG=b0ahw0;#M^y%lz10$>rWH$O}_XmiK}I$I$c{I+KFfT@QaCiKKv@;6~wKd zHxY05;Xfzd<+Jk(;v0SOHxS?K!+%FyHI!=qZMx4B&-UT35choeJH#t|_!i>rKK$>* zyL|XRiEs4b-xJ?V+~)I6SawN0#{qLG{$~=;_TjS3mG~ZUYv(}X6~6fLOu6p2eRzO) z7jfHf97lYUFa9**eLnnT;@M5cf9ua;;vR8ZE|tV9eDTj9-tNN_#JhZU+K6xT;TIC$ z?6Y$PaTQC==j(`P6R*>ypi~#}4qyDciEkusulFJ1n~4|G&Tp;#=G6Ronz%>Y#{UEH zcH*}EzCnB=aa&&R6IaVq?QbQXP2A@Hm%wG7EaxpskomNP?}@h&uQ#w7f&E~Kzw%g5 zBTd9d6Ay(AekA4%680o6=OIeSC4LC;_oo|txn}V!I`E<9;U&PO-u5L@%PUMgvn3U` ze#$v|60D!rpSRW--1=j$SI)JQV6WHuDd*uyuzuQnlXL7O*nB$){z(4F`E?TR(4Y8w zV8?Y;(*KPsQp@WM;@K;QzAia`OoF{Go35NICc&m_{gm^>Bv?P~^~yPA672Qb{E_pe zB-s41`5@;?NwE2lfS*H^*V({jo#=5rxRno*USjcyHQG*Bwiar=#<4C~ZLT-d!0P9W zzd2;$Tl^v7eLh_7S4chCOgl8M{>b<$Z0uNE&cYKvvx)zT>Hdv&yfwxj+wQ(*{LPGS z@sT5qoy^iyKX=#oShb3FM$!I(jGxW;7SCb)&5Z9c{_%|OF}}rT5pVaU`(xrA#BF=8 zBfimRXNAVcs){pH>)Qp4ucnymvUaW_o=x1AOBeARU;O)tm-*t$S$&fK6~t{n_JYQ- zPN6?GpWkBqF2=X`CybxnX8g})zJ0~`n;GBY>A2}C>8h#bx@@|c8ppbZc8Y0df5!J1 z-{MCyzB_A zB*=4164n79s-0e??cjRPNiFxAh<6dU>DvB5&S#V0?;qq`HVL+Wu>FjjwH%e$4h)a{iYD+h5uKP0sa_aEJcHS;>y;dVv0`^HQ(tSH!b@_!GoEAN~UI3LpL& z@pd0BXDdqo)8)fICce>!e@=Weaa*7NMLhHTRR3iIU+m}j@STa5`S9I{w-dMJxG(W; zU;KlKZ}!DMig@+~#-D8Fzb!{OPfUU>M_cZ4j+g{n?zVj8{4WW%d<$WJsQT$K-HMA- z^I<0Ob{{^Ec$W{ie#*I268wJ3c~%mvpQpi&v?DnOOG2yu#CxfR8(hwJl3@L>Lj0lp zUq(A}UXz6T^yiNGm7LQg!KQ2dl=GP+SU=a$j-1ORp<93ADM&}U>w!x>X}>fz-)$UAs&QX$J+oLUaIX_8)|GMPdA_?}o9(4HMLw`13mg@gA z#MR}g_#cU9`*7>OoF^o~`u`^4OZmzGKtH19TF~1(?ab-T+Zo`5GQ^JaXJ4( z!V>+7^K6OBxgrwu*&>i0aXC*!!c)VvP-VpBoCpbBX$D_HT+U~Z&`rFKxV%?i!Uy^j z@4+Q5@8g$nHStS{%Q*rP^ux-K*Akca?@L(6e7M)ff8F3GrD<9{L0rxoknk-1f0?+P zGaz9L?Yu`^&JU3APvV~wm-qThcus#R^{tKnxxvTL{xCdrChb(-vo7I!;u*k)YA<^L z*Ztu&r8>Ty$L>!%^1gEkr|VBV@5X*W-eWGo_E&aXkoS*Eu;YU5_vF3a66*Emj`2d? zr!B$uKeqpr_i#(F{pVp0|MTd-TA%9wvBa~9AEvG0@8^kE_;7n&^8RKC_PVV9^4?_$ z)_*(SllLV{@Xz<;J;@SmKRMgs|03(>4aR>v4~bYmiQ9glj(8VwTVBhFZzOK7cMWlM zqp_c@y~2CIh-VYGb}l3C5x4$aOT68O|CD&Q&(591H~H{x;(b2+*Tge#N-f7HiRbw6 z7m1ho@IMi6_Tldm@9^QD5byTkUl8Bq!@nl(b*7eA8XiKFcGOJV=I1WNyL|D-6W>hS zmTwmE?3+{VA40sshflWleRz?zPu$w~to@&+)`ywIJ>u5?dBiJx@lPY(PTbbF8sZy$ zcq4Iji%HkUUqRgS;pbTUK75_EPu$keE3N&mRQoqt`#$_OYoEBabDy>Ei~p##|Fcy4 zj}y-!Zu3pvfg<&x%!h9x-t5EQCf?!0KP2Am!#^dy$%lVMyw8V!M?Cx1RR2d}|4I8v z-10Uux-XARC9Q}#=^2Fu6z!G|i+xfq| zFIR#cf4do9-eW6ajQ-rQUoG#Cm0-uaCm3JeJ11c;=8xU?miNs`IFk5Fh(FXks=d;}bpdG%)BzEB47?CECyziyaO*bTUpySz6_ z!tDme^IHa&_eDw2?~H=XBQEcWlAzxe1u4(viye7Cl!RM(z4M97d!Z!!iFky#ybnr( z&Hp;$@*XG&cK#VBF7JPmpx*%n*-l*E`y@fX`w8+g;_|*H3HqH+kn4%dd!8idcRfMg zPh8&bBw+*2ae0rEgb~;mknj<4d4H1x{SGI{ zZN%lhO%m1)(?Wd*JS~0jb8+Kw3s9x+roPHBJk2zXlh;OFr?;Jcx`S5np<0qQG4j1Y88TuS^0c^VKiOczP64vTZ z%zuf?d;KNcN&F$=^1e6;`kir*PZF2+d`tLJf1I9r!m6eDpX| z4>vAIt%v&&|JqkSCjpmsky&cmV>;6=WPCL*)y{D`ev*UyI-l`J`Qo2O`y2N+g(?VR%Wsz_n@wLROZ}l|NPDkYoc=2D(@shAV@dt>@`AHINyZbG1Ik!&2 z5&Bc9=ZVYvI3?(JazegMJZGXO@Ics1T;6{w;R-Te6900xvHvLX;dqo2{|1G?YFtApAD_@pw$IKNv~$bO#?E)t`Zw{fF84HYX__HMjW_;mX8u3V z_!EFjJ(TxJODJIciNxic6$xAQC;s-GxSU@l;WgsNX`DZj#5~5A_vuMEh}`MKGamFb zatPCn6aT8k;Ct_C6xxZ)xwI0#Hn6&qxSR(e;ken`+~e?T7Ruu}$H()E1loH{|4xlFQj)lz@#VY*3D(ZrXFt8EZ!rjQ-5iG>;;{P!cL(T=>gUV`1{Tq<~ahT6z+5Lc)}jPbjRO}cLoKbv^- z?gsyu_zfE8k0kLk;8IWST9`VX-bXuf&ZmTP(~Z(^iOc)tCD?lMBJr0;nfRMbboCbT z;pcf8c}0KX{ocgooO=nj9KQxG{%kxk)t~Q(FZPw!$URN`3Licexb%Ck@;>HUOgCHO z{E;LI9QaHJUJhLRtn;NC)$udbQ-_%AT7rFQ32Pj7ZeaWu&NJ~(HPO}mj`&Y9{&P=x zI_6)~jKZtLVgow&T0Uc!|I zR$0X5Ja`F}^ydiTTQ2c5{u|;!;`;sG!VsTIT;AI%0n2I~%7KfYt9*V&8DGu`kYM-2 z+ljB}@-$ve`yIps^&yQvu0NH!g}9vOD&Y*q?Zt-;dd-NyX*A86# zZ1?&3Hsj0tawP;9zmM_P`Qm@W_;S9U1iQ`}jtwZO&vGuRgq!HkUc}|R7zuXXcp&kU zukti5e+MZcpSX9ixh|VObBW8j8xl^|pD0g_^GA|sW&DX3dKx{C+*;yt{)&V$;@1$D zbGs${lK6eZFJEEsONc*4eC8}qBX-{M2aPjQl6ar-<-P6_t|9jq;8HFfzI^Uud^tx% zf}PhPs?KLQKT<-N`L-ue$e?Q zA6_6{MO@CKkuZ(;a^m;pnfQ;<&o<)n{$UAr-n*8#ocki7P=BHxX`DZj!~=q3-09}H zlSys^?fkUL)5u>*JPll~x660Ee_(uhU$O+dfA}GBIj2T~t)E}g&Rsq`-!i_Ot0}?O zlQH|4bh~}=_X2+45dLQYmv$uQ6G*sOf8x0U;tLu~e%{Ue%-1+0C5aGlx!zy-(mj!O zF8rObGl_O0#P|B0r>&fmZj2>}%Xu6UtUvAAKK`DR_d|Cw(bZ2hj`7i#?sc>y=k`g^ zXZJzgN&NI{j6a`@(X@Jyc;_w#-)vy@Byl-kS3(Q%SBd{^R};U3_-5jAo|uFl;{PBn z=MYMGoA`F(a{iQre-qC@MV0wm_7qc3h7->MKGZzWV;+eU|&(1VM zOeenU3kH|J$CI#t_=V3He5!#}y~g2*D)XdMSR3U zwGZ*E13e9_A7=2QiSPHQiGMlmgf(vBB!4boe0krygn{)4 zaXDvHLcji0s=;BWo$+UPcsgb}{puKO}U7LORe*xpm zIXDsyq@P!7oXSb!KE{`GJtW-D_`f9HcWOxEHT366;&Kj)go%v*Dsb^7E+a1IPD!|h>8>Cy=e0=KLi_^aat^tKQN*t%ejn?(olo9IT+W4) z@CxHUNL4w+?9pg~r z!r>av(C5oZ%%7R)>KNdXpI`g(vy}1wi|c|?`Z{b6qzv-K&YOEivgfvtPZF__(#6PBEYHH_-klU%J0zd^yKT!i$Xm zg2pwJ^6@U?%ek5oj$r(c9r3?m{D%(lbo>`~(L#;OHtj;r_mS{x{fYB-vJEchCP}E( zpV%kK9=aSCYCJ=g&G2;0ZphLzea>$+uA!8Vu@j9yWxE-FY`Z&v_`zXge=nw+LtM^{kzns%lxRG~wEi)h z@$1@+oxd{5X~Yl6Hu%}Zml2n9mnFUyy0ijT3(ZxYUOUzWVSkBsNdlUbZ_i-v||4`t1f0EBx9me=Yj4$WOOF*;IAxvD(!IPlR!h~GVoQgy_$xgNim_$uOZo~DEf{fTXG;F51M zeAjyu6}EX@6hhb>EnDFQos65)V9J;@?WVfOu|?i65n% z>BQyyYYDcWTtIxw&pnOXeectV%X!xlBDAxVcp>)z?0(vE;F1r|`{n~{7{4=Q{IT~D z))JTVyd=!jpGtKQ|L`VHBX(cCOXG}`BpzY>t;ZNYYw739#N|9>3DcjQ{e#j6ZhW^ef^wa9lW)IxjfvywCX0a(q9F@xLTqw#e9jkomLIB;$XxFF(fs zA8MXFQR5kEH{ZCKTRQ zh#$^zd4I;=23+dNX5aHFqfnrNukz*pSl}|g$a&Zj?7VJ2#&7qUPGTnT} zU+0S-Wc^^ORc>E+|KaKG()Ht0> z61Oq_F>_6Po1YI5Up>~~w%mW`u=6V8@63J61x({Z;&OhW1awC_eCDu|hKW`t-skpr z-#jM+_)zWQK#gbU^XtWMl`*gKiFa^5vnbsV(}`b{@HEiK{5b`wR_}Wc+8=7(3G$ zf1}3vBT4i!{+4!6qx&=6t;DBu{Icc#PvUZ3vV>O{f9D^W_R{6^CzJT|zWcv>1DEn@ zKEM+*1K}u*XQ=sy8~dM;DW#peeD+Tw-tEH|5Z}snO*d67?e`yI?B7ZI%ZZQN)8z9i zDzwwiTfTAR8pfA%#U)&lZVcT`{IOPpA7o(l2=T(z1`iT{n)ZL?^ZyUTH~R25XlGl{ z`1u;g#}9}%aQ z_=homU$(hkTd#t|k7_e^(9Ct1Mf`zJ4Q~5~g~T8Jt*7JNkY?i76K^avc!>FM9`WlI zn{*@TCjOPgzkAlizmIqqaNYm={J)#=x2!V$*!sUge-<*noQp2O`d`cVn|PdxaZx!!NI7WV&$-*yS}f%)?=a4E+=pPxO%zxLtJXgf5TBwnNa4J>y% z-}``el<#@SzcRj@|0_YC0Sx(HjK7)v-q&m|-!lF?+?PI``H*>}Dc^H`;)xmcNBxQW zn8fct*yNAxuX2b#vee|mV~l?i@tek&__p3I)How0iF(HGWBi|!TS0t7rKgdt#4jW+ z=Z#CyXO4>`?$sLH-cRh(xQ?3gvB81A09?;MeedUagZ4XSn(NJAzI{ym+0iE5*NOj& z_!;|~_%w3?Lb%4hs7mm7Z` zC3_6<(c?_IY3YWTL44iw2A|9Lr)oUKwEofPz|W~kq5Vz73phVHgYkQbAGE?;m&N}^{Cc)8I}iUSaPen?&!6vz zXZ!HslcgL7hkZ1jq2``z(p^nI4+k#x5A)f{WBkN+6aQM8JlD<*3Z8&zDNJ>qMd(e9P>JTc3Z z``OHg!-zk+mx=EYFVQ%SCW+aMzm@w@cHX-LxLmL2yWXY5XZY}D;_4LEG}ha8+7Di7 z{JfHBUrK!2kBy&g>4vyo<4F$k>o08lbtb;OU-k%a@w3e5PY>gN!RI=fY3C2b)6O#f ze8zO&A^yw;gTKr8Ul2dN$fRrc@xCYi_Rl;W^Ag6NkURAH_WHU;m-; zXBzQgc_u%%`S#OxBR=;IG1h;0^>jOu!(Q)Z!REy(Qzg}?Kr+f_I`F47o}m`Ed)nBgH2J*72cKi| zN5=p2dQ*Qgm~Ve3e)eo*=ZP`K(C5TIKGxvnTyLhKBFVUL(TT>+wloueH{zYVk3Yk} zYCq!j0aISnInEwM{2Z=pI0~yE@qayK;$K1gCldd9vg!H%m1z=~3tY;#+gHB!Fi1J` zP|iA>T&=1r8yX@@8)Hp4ZniSsA}4evT3TysK}8~^3r?OFnKg6%f=C3vrlkBju{4RQ ziA9z+#HuPABKlOsNM-9Pg%b~(8=@`In#qMF#YIYpNPW#J`BkFK!HPAljg6~qI#cIN z(aB7k7n(gaVt+|8_WO=h^bw3Ym8SZ}`lf^&Te@I&S$=L_VV?PtUzlURsY`#7O;*5tYZP|Sim|Ku#N?+V*%?}z&aMN zjs>h^fdR)*{5o3##k}MIs(?W-rR5i1a-f8l94O%>2TFL!ff8PFfwf#1t6vT`kI|t0jSf zFSJ||pyiSPEtdqC8zluyqNIS9OE9(3&X*K0iIM^)QBq(n7g);$)^dThTwpER=1@{- zE!&n-QfMs~TFZsja-p?cXe}37%Z1jmt#u`~)|If<<>jzS;EOScFUBCg7=w8^EQ`E+ z78AahOU4)D7`_iIdKDw~_5O*Qjd;`L2SRb@@hOq{@) zXsr?vU2fons!S|xnis8|6DwU^-4Im^6Y-W&#uq-Sb@{F3wn`igP`c{=A!W0zl&9;Q=hySe%3V&zx9 zs;;YEHmANpY79;}W`)Vm$z@Z_$wLclu8b$5)wN4m>q=Ofc_q2|%mg?kc2U1_bOn(w z+6(!jE0BEArGPJ{*OKgEocvtI$X5>Fo0G z#rT0Q1*)cgg|sR;lQ}9ERvK%<$<&FuNM2D+PKla^*+!zy0=c}*SToxN%Ea_|d4>6= zQ^gll&NcPTwe=0!pj>f5j_H-7}hr@o24@60L@a6b6vnrIk%p(Q0Ya z@mQ<{tr=NS7E2`RtB4c^@{5eJsLpIMs)afE3P;l;XjZyO}9<8iFdGGj9+blmDDibY{##qhdKt2i`bE7y;hZZdX z@=fg4yqY9K$j+vv(HcWl*VM-&iD*m2o-3_A!Ua^eL?bQH#^y+@wWYZgr;dxKG%sJP z8=IvglrE_fQ?%yQ=9|8jh*(7>)rO<-cq~2;Rnpm^7-?>1a=P#Ho%oF_Aiu z(fAJU8lyOOyV3ZD>o;G-WhI%-CMb=$M7Pd)lE>0Mqm_-84CI-nlN&(yqg!+!fUza9 zI)RKftpZKKbZzoQH!u03tEha@%?n>l^O7&d4!)Rf2VZpWC)7Zvp&Pd#)}Wb}31SVJ zejkXLj>#8m$Bey#SUYCy6~r1egO4EApqVrQF{813u^yVySP<)>8I1)oogltg%cgk> zMau;_dQd`FVMc8ELdykcaJrww2y4I4=K|BQNn~0sFdds9)^e`3%+kp($hDSpt!4B$ zCW%~YnPrN|*0SjiVcB$t_>yNWn?6YpYdOza&a;;DtmV8yH3!GZx5QVY&p{^^LUSu9 zhC(SO6)myWL|kSTd8$-ucXh0xAzIy1j|Etv%nav66ZLDN5e$jQr@5{5Xu9Tz`1}GC zHd^m|J()?UnubQ*pilu5(WP>>e55YcP$Lr^bhBu}2E%#r%k;7@(uk1-m0DSeRbK>k zUMf5}#A}Jho6rKqv_6AA1&LM5A`#8Gv9YpQ`ovhZ`5MhQ>*J@k$lW6l^AV`rFvr6+(OhT49zvD2Ju8Bw?HO7Yo_X+A1Pxn z5dyf(BE(JIV@EKeV%n?SMs?5`2w!UI6LbbGb4o1M9F13+dL2N^IzS`*c!Q&5bx&Yb8t5O+{TAZHmV0tLI0ThcL}S z)t?@1K?l>++E^8hNAikukY&{kv4pRtPOEQdkQp8(dL|l1CAiUmv3e?6gx;$uLw%c3 z*;LaIt%+9Ka>Q~*JBD_x(BmOBDYpfyo1>Cx$PIMFGo~)iE08LLv`v+Xb81l)i~EWR z1_oLNE?eA}EJ1eUV9hNBgvn%{?p-68GNKxxu&e9hgNh_S7n5o=do}vY2X91VXaMx)_62z7KF%VJ#|9~VCIiyBD!gR zBR9RU?kc4nHO1o6>8wFFmRpdIZ2WP3GulN98lp@q<@!w%YKfu9;?kiY;RUhz_%8Zb zn*x@Gh?Rs?Ei56-W#{YMkZRK$OQ52mo<)-O?PTZd#1)ZwyslDAFB8!OW;@a$z`6_z z#!y}{YD=``jK=2FT-#A=(bHi1u7@Q(drm}(#rfJqG`cKRM|)`NXy+k5r|A zR0g!h`3YT-rEIXs(=$Qjtj<*AU^Qwp%6^cyd018yn08gQx+N+ZiJ8H4X*Q_rvXO|f zB2gW$Z$^>j=3}BXqcX89x*C-z2a9>++ls1IUk_k930d0d$s=k}BvK1QEo!QCq*9(} z30SkvtE^8%Yo&&?L|0Wun|0@ypOc3&u8Hc_hD@k7jf~x^85K}%r2f{%qfyj%^j4Vh z%wDY*Q>ff1(5ZTstvj7ubgn32scCwRAWCZK)TR|u2xv3x=!$Z%cr!^=#~W%TA21_< zuT6up%?!S&Sy_wTy(txvGRDHWShuu9b!Br@k1AqW7EGp3)!h_k7xg}6?JuVN(jB7D z)lG;KY+ow2fk_)d8?X&|K6<;#2Ag*rJ?z+_yN>+g{9@B_Mwhonn=sg-o}-VEH4qvI zs}L3-tM&RsS|d7)6&U{V&~fG=rRMll^rQn5FI>i|NG(>DdRWkP93w%=j*+mjGQJEw zW@2SD+KeF@)522JXKaXL>4ts?BLR8`(;Z-_z*=7Cf^_f^vrs~fS-BK_J_;F43qQ>I zPW1CIBJ0b-x*4rO8cB_wX-N)Z^<$bmzW(L<%Kt9iwkJWEYQ zyTS~tx~_gjbYMX{Eg_9x51Vq0C915lr4FrRX#y>?2(zd}RovGdNfFJDwn$OP?q9xf zZ(4n{p~kp}DFmuG`a*nSfu}nU6j&7debuea_0byBys*T;>=eVZuchnkl;+hEn^WI7 zP-$3irMBsewxc5oX#O%>9a;c(Yoa7Oqhi|Iy*GWL>QN(H~J;BOe=0^ zLaW3!2qsVP4HIbeDHzWSQ5uc06?&GhyZRj6aK~`P<}#(5Na=RqbIqV~ zon8%}P+%Bum#&u4Hy8c9UL95HrIA@X$u@FgsAZk5OL{)Xkwa!T(ooDg4_VJiCw4;X z^q!%Vz`zg5njG2po-cV;6>DjUNq>Y{^z>+p86;+<b?|*49kT9c8(kprDSw9L0%Ln(;H#NuZt7w zqhfSB$Qga51$pRbr^T@S+kkmMLk*^aQbe$5re6BeWFUwpbOy|W>1vy933g9)3qVW8 zb_Av)>cm)mlkI6x_B9Pdtb4@<29rXpDFV5exlWUHFrIxdi(qVpK+8;|^!|Zw3q{vl zJ;#>)Y?LF$jMhfI34nVU_>DmuD+xTFP>DHNVKLgiR*_5zVE%5ld?bM?SrTEA!_~B| z+{hH&DvXY;SY~@&{I0^F3b&;KOD~FnWj?x}>K61WsF6sH6$ew&fRx)1{Uv)jX`xGl^b223wxdqJzAQJHm@_+fV~q+`r2z`bU4<%w7X zO$0j!I}Bl4L>G0UA=Z-6<~$aQR#OHD^rOzt$%kz4wYFYWvHlKBRdJ&bdr9a` z@`|KmNJLj6c^M6G{}R_Bl|?TZFe!vL;zX^k>iSw?+KjSTB;wj}|2*GL@dp$!6k~CU zwRL`}^ht6bBi0aGiAI1W7PbO(A?rGc4{0B`9DT*;&``iJ(;lU;mR8GNmMIKnt2OElC7&8Y|u;3E|)Ib6v!vs zO2P0wtsz#)JsX|f(x9a%Fw|ByaDgrx6c~E2^NnEx*E}y;y%fcQc8*a%rUzy{hF;MO zc&Q$U+2nPg{MN0rwNVd!*n!7wEle;{)x>J8IA;cUbc!{XAE;%uY)R_!#RUd% zFC25ZO5ch@EMPoCdFUq$u#qvu?8t6klEs>r;W-~IbVDX&l9g8R0 zq_^==L>NL*Fx=6>@POGuv(!1v+L6oB;hR;1T)pnTbRNik1D%F6T3r;nd&7XK`wQJy z$(Vw>fbmE^+Ks~IM}0ijq;HX60|?7y$p8#hNCmCFFkq4an46b}J9F{Mm1uq94mZuP ztpOdocHGe*%}PZ#jRF4@1_RmI7Vls}uK-(HYKyBd0YLS~>^veD(-bpneDqVPxx}08 z`dTpY!j=@)ak2w|yNSyagLX_!w(DIBz0-r)xV`Ox9!9~5#As_9H(CX<6Qe_`^xvp>NfmiYD6*pbXZ zUu{QRbk}0dPD)BJqcqhN4<^YM{ZxtEY{bk_9!y!-RKKbv)&yfKqIUL!@zi8E2EGBi z`gVtG2NviySRf^XJI~rUg#T6x_VJS{0(R)?&4?=-2c?b8ri+nHSG3<;+;TdlvSAsz zb&Qp*@dSKnzz!<*a7qUDl`$d0b395f2oureTFtCx@K}^?S5oSxNlW4QM}_&TvF|VU ztZ?1faViqG?MVMYYH;M3;6lFj>Q* z`XRAtJ4Od&m(E*s9Oerr&nxAQnIt0HU%F^eM%XszUa{0|?8xX6#cT@=2cr{W7s%e2 zU6iX*xdn(RoK7L>CSwGiG-E2zj8Ro`T8}oecf4b-5Zi{x5*aySxG9HQzL>)4t$5sc zDKJk@==LRpw!a%e)<)}b8w;D1xtIiCJ}-kjHn4E9^U&xyeL`y0DBT6Jod&7o8REe^ z42`W#gZ4vYbdVdC*kj_JMm1JXxWT2J*1Zo5>iLY`ijc>xw6{ss*xbgH490$107W9> zq273q`*i5~FnmjQj@xPIh|H*kju?+)NS`<`B}bK0X3CY?mDV&2UWb+9mLE316Bzw) zTLk+&gT`>UBRh7IO&rY4@&p-&(l9&H37KaVVz$RBj=M!zyzqvI)RsbX_ZM{nMK2d9 z8`zL?tFWfNws!C)teRs8l91RtgU)4`o@8hp;5SL#?Z{Bf7umo`XEwqAx-= zyP7c*W``~}XOpL_daOnf=^kWYns4VQsIC|maWT?&?HJt92`6`P^3&$1Ec{VXWd@5{ zoO-clo{@@`;*NqIv(TPU%JVS}M|F{5`7e&k18Ug4!7zkgD_(|$Ds}*2ADeaPB2sPH zu>>2))BL+E=Ej;-Ubb)3!N{@>qe`6&FIX!jZMkCDk~Sbu7U*Vzx-PfVrFgOWJz3U! zs43VQouAwk7Hj`WHJj3bW~=+AzdmSf5QAi-#y0WfIOlk*3qyI6uDz=*`(%? zWDd6AumPzbbe0UTOBJ&WliaX(R`kxaR46!9jJ`P+J1!~fd8q+rlTMobG|3$F^!T1% zDj&KZ!2HP|?|2vK z(QB|tUa*;5VO-Hxl8eROJuzK_Y%WOefI0Nw;bX^gPS3Tln#1;w@7|xTMEbF;R9_@J zi!l!|^|KCln*X0R%~%CM7zU#LlZ$h4bP(K}vlPTh1pnT5iAAffQi3)nce#t^Jh}%V zLbmuhPg{T^55RtSX?@<)F|$ugi{Klch7#qW`?+B;{5-N{I2LtmSuZf=cfpG?)(5{p zCGWV2l_N@=nL@iz0LCcFpV#d9!61Yn`y*c8Gtgq8c7=YbB>=KW6<&X|9|Kd|Y~5G~ c;!;pS2tR4sNUq*q45~Tt!4DuEniJ1;st?D4-)cb=)I@;!0QrWfKyOw$afL%{WHlLZz;8 zk4tS_o1%mfl|-v{)V8Kp>xf#}#ckUz^weS1>{`d_{&N^9|dVVZ*RaiJ?8srj8?%QvAUiWJjP23C4L zROy~q@j=ye#-mY%M59Lvy$cs_DoM|Uj_)M!QO_Uyae9uo`4zLvV5`3iZE?N5=ggjZ z;Qo8hnZDUoy+4%zjJLqi2uI*M72kdE z-5lR-@I4h@>Ub2s{G6nLcP7HKZJa>`zB|}7%j!O7AaXjsr&++y5Yhr$+BAdRZG3-( z$KrbmzPnl2P6#L2_(2Gd!*_3dM_SnSHjLVEYlH{eIBmSEjh|pc2K1m&_^!_cKF8yG zBEARWI~L#n>rW&k(D_RU6ht=)V)@8V@=S``?N{eAotljPDN>>i+-y z6yS~VJ=~&qL^uxLJ@MTP-$U_rpW!Zoa2I^{u<64P9)j;_K=P0ADjHk>s=QKOyAF~ z5M;ZI0_3P7@KfPL{n69M`h(w4g#NrD^4AuT^LY_DT}9-aQ$)^oMd)`b0>8NkoW4?q zZ|@KLh_c>5q#rLL=b9q$hr!dIJzI*{f%V@X{cAn_a#j|BzgR?{ql(aHiqJn@1pavuJzI;& zpHl=rq)0t(SA_n;BKq7}gnpkQ^hXqd|D*`Kr$~9vE|TwkMd%+YBA@e~{`~faBJ`$6 zzR@D^H;Tweq#~&Yl^_{Dx&9%BJv|e=&vq9e^C+m--^ijqzHUr z5%{e|H9m@{S3 zq8W=kP+v^qeY}ff3m48`=uKNVZNGiJ=`&`|nNl_5=y|iN_MPlfv3b*7)SEp|2ne!K zOKVf!^f}Y!%wIGE;rsjkz7@Evi~LZNWv}jGEb1-ohDErca-}&|9=% z;p}-;Grh@2pE!9zb=5R)rm%u^-n6+3$g*(SENDo%q@P(eW6m6J(d={PO_}3OW-+Io zH+kBu^Cr)nGJB3U_dL=-_MAEMr;%yedES(%^A}cmb7#z@oO5PWEtox>Vy9Ox@TSe0 zJ0FRu3(o^5EQActnOik`?hJ44+$jsZnV_CV+Bqmp^*l*I&Y~Gr-Z^vTPet}K7A~AO ze=@R}QZ;-2Ja6G#QE}0X84!pJA#ci}X(DjioEcLVg4~-kf8IIg0x=n47^2WK=3RhX zrq8dg@@68rNO)nWnQBcaP&L0Ah0{`1&z-X9JZd#<%Ay&}g2i1hrD~SiWiYqqcV#wVyV5k)$>?h)(IBI&>bRJ{@Ez_d^vA`5{6 zAb>LP!^xBBEY^4DPMJN=o2iJIG$}NJ)sg=UZ_zxP3koo8{yezPj2Ni_YY!R?06;e&xK66cpjUFDYg6C9|hMz1Fclj4GP5_Ut#E53YTx5 z=ZAS!67}G^i~l^2Yx**LtGAww<=Y@{GmPu}41iv@B6Ms1&1cWXGS>ID2cEFaBt6jE z)uxrdB;e29uKgC*c3f||kL$O%wyktPgsz_>oNIvK)2wp1rl-E{GdKjN#oebg1h+*I z)UXhIkRwJ|7J|F=Hqj$P@bH?uJOrms?lUR`=e~;jL_=`5J|-?6f^&WBJ{2K2_j}xD zQV1Si-&cm<;eCc#A-JnU%32VDbDi!!H6eI-K9dN+r#NDS4I%huA$U^=&b=o0Sr&qa z_dA+H@bKPIO9&p`D`^eE-F^b|XbZvJehJ~}5S)8R?$a59bFJ$>nGig@;m{R=bMMW4 zvLQJ4R@}#g;M+SO!tM~fEClZf!FLG3y*u*$zhekKI0WA*1TPK2hlk+9LhunGcv%R( za|k{%1m7hDFAu@pULDb+LU6Y?M|d;@cYA+?$3t+pPe^!02=4Zq2%i*!bFa#MDnszS z91!8G5S;sp?z12SFLywMH6i#uA$TGL-!}wr2*G7&u(+lWoco^cvn&J;?~OHw;M}Kl zpOz4u`=jpD8iI4L(|y`PaJNrNTsj2jo}K%2hTx+e5Md?+9}|Lih2Y`6)NBYI-a9lQ z_+cSA-64211n&vK4-dh;JM;cOE(9MOf=>;>OGEG@LhxZB_>m!aSqL5r!AFMRT;sV< zc?f=#10oz1g2zMfXb66E2p$i?j|ssmLU8VxyU(N${5S_hSQ&yJAA-*c!A}Um7lh#4 z8+V_Y5WKboHoId+VV3hx z?3RIEyzaTd&#pV*n7ZNKx)I0WZ)E!@Voc8>XD+)ApAqAj<`gKGk@O)8+WD4qh%H=}npDlqR=8(nFZ$R3=v`=@OS)=F}w@mGl=(bIOt{m-I(WbE=Xnlk^&z zi%fIslFLeZ71NxupVrko2ZZbEwZPkn|9yImG8GC0)WahxS~Bq`$rl zX%6YRsHDGOnnQW6T+$yg%^^HjCh0XybLh^MO8QNvIb`QNNx#N4hw5DSH&XvhbBNAm zCB2Gi4$ZlYq?a?zAvu?p^rK93D9*J?`T?dn1m~J1eJ9f#dUH*ZzKLlLxw(X-uVb1+ zZEk_2uVR`*Y_3w$mov?wHCG|&i<#z-nu|($A=4a6bLEmgmuU{6xiU#lWtu~0u2j;e zGtD70=Sg}z(;O;u-T#sLXFAGsR?_2`=FphSNcs?_IV9%NlHQkT4tcp&N$O$-vRtL4OPJ;mmaCBT*9oLKbmgLw{(@-^ zS-Emaf5bG0s$7|**D%c?DpxA$H<{+pl=CG08q*w-a@}7`{WHy>D3_J=DyBIE4E}g`_WLnnOn}D(QtxbI8b*OZr@qcT!M~8S4TZ_Dh%^wQxnIGc*@_ZcDNU>Pgj+!%gB(?6#h(% zCqFougo&|nWaL#J+g6Gz9P!i^=j4o^5KPZcr^6Pu6zEJ7Qgv{*IES{9kP}0^G3-KxRHc z9kHy)X#_0kUrcmItXn`pu`7wEVx6m_gN2k`Njx>SZs-WFoit{rB_)uznl$mcbZI=< zVJ^E2An>xA0qv;)?N`@?X@`+^qNQaQ1lrvL+TRz@mXUT>OUv#FwCgr>I^14BJCd~D zCR7J@U7&qEpj}izTTa?nEiJn>(B2o&9#ud)inRAwT6TG${dqvUO#v;e-eE4XwCoO7 zR{rh?&)o7*-T;0BrU4`y4>Cp9hS5zHy`PoBPE^TG36m|eWJ3cf2Zhni7X8VkY7ch3 zDy1|`)?&$4TQc^@N|t*tq;jhzyWNtpqgJw2VX`($R%6N7e=FI|VY0L(JIRu`!(3|xX{7a>z9BPo9g0l)e;{c`J?D9X=!o@bD74f}i@(bQ ztif0hXeoq~)p)92vQD+J4$NBIYXF4_zzOk(RB3O37ay=H4-;=d*}^boR2T&o$65^% zPD-A6c8K%$eSx59P zQh7<5IV8PEB5%3P?&$)eAiH}=ROyIr6rySr68u*Y)$CBe=%0TEi87Ap)B>VFlPHP2 zr>rLX3Q?>(o+?K^J?6ECZDppa0RvzY61YAb-F(OeIPJzz^u~I0L2K>>rSZnvE;FzL zVme}(5cO+tj9#GE2};GfSdF7&naDMR=(g%ce-zxrjKd$iYN2mdo(Zw3iD1BBQkO1? zr^c)@_uVHdXDuTq|Ij>Zs<#oZOH1POVUlPACjg}g5QVeTDQe2iV|R;;&i1q#rqgVN zMN&LfP3}%J6p8k%Lw$$!6i^TV)aOXFmpv`!>@@EQ3PY7OXWg$wZV$)-gE?1`Kuh>1 zDPe7<9fkHxln9KQxwX<}W36hsSWC!+!=z|i%=E(s9|nWBnCqTLMjf%{5VbXU7-S9J zq6Tm7&*054jo`)LC!7JXsfhr@ngfF$sLiLJ&l&#ea+FESfB#8vh?oplwZ~{Ps zBbqn(xVywK%bdZN8EpmC+(qebayhtqpzwe;(;p7u(u-X1e3FKjy@6|avx znJ_>sPDko5CscFeA~0wcw!=gDYxXcd!}SQ{oM=y|+=O|Ey0|9fx}Stu3UGVc5nU-n zv4kt?E>=Ah6)+TaCJ1s%@*0#C(V)yccLz17uR(X+?yaEju3+2@??(^C452DzA<};j z5|zp36#Atb2vScd7&^U1GBwDKMbx>}9H8nfpgNVB2jga`=AlE0HOmUY{2Z9}Y>4z+ zB_-0SvwmJ31w)-9^6HETs}mhb=d4dht_j(1=P*U62G1~yo5g;!sBl@k*pG4ZzBFmu z6*`3l^CB?ql_ApKDJhXo;ZyDxzku&PpkhefcpI!<(6!Sb0>87=BZs!R>gbJh!a(0T4@{M)25%0btjP(w3r zW>CG<6Uw+kK)mVF-W;MiTxnFK((FZ=Y>0-}P?0SKxC&dYeLgEp!Kko*Y1Nd1?1+3R zw0Aw9fTUEWEvOE6D`+q!;VuD42$0P?OBWMSaPw^<@Vjv~-*#^m9SXT71n=*&4y#$% zBIC~&-$5_C{!Po&I+lgTXh^#LCEBTl zX%&Zee2(^(>f*5h-nlTyp0tavhK%}#FHDZ!>i*DCa`!H$$O zOmmnc%{tQBJShiik;?JdZ0<}}d&9qCASpw#OfY5LDrfmidS*0W9fT$0Xmq~05r^xiz_(N3yZV5}oeIMScz zNx4}kx}v#wW>ZI+cBI_brN;nE&vO%a+L`-!Xy@V$spu$i7|h1=^L7$FCBsULS5jRa zKTQy);G<(*ktN6Kls2FxB8kSP)y};^sF&3?KU-$GT;qi^m0t5bTxt&Blc0>_Ie?boKEw2Ko73W^d{`?Z0{PTqyc+OM^*{aRtaw#brpOs%Z3 zgf2P~ZZzMo3yFeZEZIsR(yR2(vpON`zJ-E8Ek|UzSR4SZrt(33J%LDMpq@ z39~N}?P-S^E+{v9PngY#_5LC*f;CQ<@!vgR#3!u*xksAGItux{mI%v?7z z=*q>Ihe)92m{?$r(?1t;R7%P143a&-Kr=wfRX+=u_DacU1>Yy1qlM9a8Y<9^j@h9ovY8$lC-SZVFu#}Y}J*y^<6oTgBX4uuf+3q;jxb5BA zxTZA=aNFBWg&ZctvG&+L9EU20&e2>?IWnG#Vra*IomIK2M;UC@50jEmGzl$Gg;+Nc zTHOe1Mgh#z*V7C#*Kbd#5hu}z+p@%AT{$0FA*caBwR>;UB^1#8FVa3yA(<=aZGh~K zm;zoBnrdXP>8D9h783HH5QK`F&#;NK;S4Vo+9$MNDsK*HbPG-aX9!I`!(&NM8Orbw zA+W2Qa_Okvz|$e9W`n}8qypQFWa^mh>JzQ%6W9I|h-9oax4(36($n);h+OTQX_y8p zuDw~ZMNhbzJO#q+-p`RLER(yhC!m<@gvktGv=f$g!Y(2Y_J6;06TLEtLH)~~<9rM! zJNAU8tmt$&`D%REXW~iB8Gm3-9LsW^ydS6vr^~)MLA*DZ6JPdmntCT!NbR6Q-G;Ns zlwbD`PA|~|pr5y=LfX$a0+#fr6Ya)`Mp+CkFNYvK0^0H&S|!#*`^uJcyiwfE)IUmt z``3I<;dZSNYdVV>fc$KRD$Km_l;^FEtrIvc8+o#RHtHDDeo%G;Aec&qDcxZ>Nty;q z987OxO;Z$K15UG#;xW68HBALP@?>mXQYOW9vfLa{wWp0-x~WFI$l@HPlXCGwAp;{z zPKK=9V7eCMOc(jG+>1OJ9n1}-D@p{F1%@Pc_7-cJA*9$C-e3BP@T@J?G+&7`mZ{T* zO$!trq`632&Ur~YV=K#1S7xgt&<{mc14~%vZQp(=&DT$0ee($OS#Hk+o{dym@iPZn8&UCHE~s%C;gG?27;aN?elp%J@5Qn^~}u$ z9nlwvY7Tv!Od_i@X#HK7o|#{&b7V<56O`@U+HA9CUsUztboI{drGJ%CHEYTgGP=Fo zK{i%M#oB7}pCdU1PLW(y_agSaCEZXlI5){w%dEa+gF|HdShCrD$p(eUhFG$5LAJ6I z3Yl$3mw35<=o+GF4#4f{w?*@A^OLo35uQuw28G`#lhY3K?lg5FE^}N1yzS{i+HOnx zgr%Ja+T3e0orzhKXT}drQ5TbXWD!L64>wjcJFVZMcQN)GP%9XL0(bFdF@dL z;d67~I?c_q(&hn$%xJH4G|Lona(lu-u29JQ91aqsO|X@;(<(TbeWY@@XFkM(J96=Y z6~z|Q-Ym>xuP641!%(J$oL2*D{oa_KYhay_)iTx+4^D-wBbC}NGF%I&Hp?N~TgkIT zbM%{H6D~8<3+rmzyo)w<$(3nnU}oaUS3)iX2b{7^TiaThz;SP6mG-QkHc=O>Hv*F1 zeM(11onpM&>pH=F0M2UNG3<0hea*X!)QsfPNA!>q+iF>=4K;ER|)^tf2` zP(Mi}#8EIosZUpn-oz^N!(fi5{0X19QSBJSf{`p5-fuZmN0wblT717{2+_8Sw*x?S z7f}YC)#zBddMjWRVna|3$TgD$fRPOAYCFBi4X*F0-cXhwc|g^c0j1?&Mr$hx-POvG zQ2Iwqq+)5#&JJEBBEC)3e(P23p*@uspN2jJ_+SI5rqt~6*1C1rDy^&SQ7yj3Q1dNE zu9UyW$IebWBE})e+A25!9?bqK`Glw4R?A#9+Lvp^Xw6Wu%?`({&=jpT)*Mgze*}Jb`am`1sKm~QV)(uph z4AjBN=M$7*c3wEpOUAyetNqfuND4xt9D9@1v2Vp1LjZ8`4G~YtR@?}$o3FHpVnCwa z-y~|k@v4SW1JZ!Lgz=%h>6g`4u-lW+5`4v-b*rn4kZEweO(%NeVz#cC}UL{jOfL8g}FC> z9x;HpupcXsF$2uc0Lm@Z!KyVue2VAiD=5^whe0}5W04!f5Xd=ePNV;&{58h4q%OpQ z9;X65P8)W3an>2@Y|zH@TawBKO{}Y#Am^QpXt+s#8PWNMk{Ln=uB&bJsty6T2TBRY zh6MA}^jQMr`a~=!lTz|t_XXZ;J=k7YIyV0HJ(`2I6IGvjE~3!s|{bRzP`V3EZ9!++#MXR!Ma zvj($Q!B(rGt|5u-nysO-qOfj-&nG%x24|TpW(u$jy5~9r7oaixBZJHikyxB zi1o%u)G+$FG6q<7yrCKlRSgmV^|$Q!2bF^XGi$OB|`#qll{Qh`B;A zyow#TG_E6U>J-Jp+xSf{D5xAp zw6dCbZizMPs1WG)1o4POy1YhG%k)IENutw4rKM1B%WUO0y+n?>+Kd;e|BX(iI<5S) z%jabgD$8hg6>R2aj83}KC{vrGdrI`lr=M13+BlX+mYk&0n}mv2Jg~H&8DCMV&iL4h zXFU(=l?x7Gt=Q8$&^(jH9ZKw&Nz;lfO-G*0w3BJ2fg>6JKxqX{f9Ne{?_y#`nadVS z{c>Dux(eE(e!I*aFCilHEqlm^l>DOB8B~;K&4wiqhP=20D%2q zzqps3gr-yxyBYuT`)o6@ELF6-8+M}jm}1&;cWBSvlwrx$rObV=iz78%O<^46tD}@4 zNxB6TYOLAWR9+?qXlak?xZ7e@Q>xx8YB9f)1a7VzgYzKr+dVg(#jwA zp6hN#Ar|z{l|lcU#3hyF@y(Fbxv}9u??=dD`)NDLQRmlwx_gZ@{wzwt{4-4qY4bH5 zGQsX?PpINOrWSiGSUzmt-s~XfDP;KCI9ab%))upE9m|aBiZ!ERO&1Of*Ir19>m0?` zm***@hwm_tlIkQz~o7n(UeUujc z3})`<>WEJXlHn3h-)5CzeKe}{;fhF z6FA5I4OTBG!unbSPVFr1ZJ@=T!7xA~Po|Ug)1hD83jQ5*;Y}$?##4iy9|fzf%UYh> zDPOaCU9wUY55uOG1^q90KH%ZhaI!g^Xk-A!kwUQFU!h=xX0XzT^MdQaZ1%5bfsoZ1Eu+U$@2JHz)8?(?lLYp0QZwsAEXxc%yvd~ir%{u5n3q71r?_I0!Cm0y0 z@9u<_Ip`Y#&20&wE#+O%(OPu1T)!QV>yi1N)cDixF zz_^-t0MU>qNKK%gLNyVEdghe{@@VB5=$|pqkAR-%<*9K#@nbrYjmpKFIrlRYR#9G1Gd{1{(`Hjofaub^Xs)Ne zzmKYf+nPuBrs!bt(pa;px%EOC8MiF#{G-zh{3}YIvV9KL?f-a_Y21{sWvs(KE;!OC zW7@ns9Ex12M_P2Ol|N3AUHdAsxhm4;6lpUTOU6!-Hgm2j(&iNT8k^5hgcGG!Gl`0P z$1_c>xMzNxBF%e=v1R;xd4;%7OMACEON*JcmhMw^pp}Wr2(_B89~1Is*E+dWN>w+T zqcBG0s`8pV`{Oj(QZy;3n*kR{-QWVX&JCBDbN&*pn`P!yN#mT~*3E}=#3W5HNt21~ z1e2`Q(@oaRb3aazMwwV@kJH#7&jvYfz?C|iQRSB?PAh(d1MX8GyMf-^SN0&v z-Y+k^kZGtzooN2_y8ZCb`WjmuJCsuWeMv(=Qr8wfE2aYT_T&ufL<*dOCwukA*y z3JkVlp%`oum9qw8+-!$EjKKHwLctIP5$z0i<7_cl1wkpj!28+uFxb+61O~%4D28-8 zm2Dc+lqaq{49rvHnUd#ut)JqQ0+yfLS3;l}D8chm}>;7;9RG%W+OA@e6ejg#U`X# z>1E?*{z!AVsj#lt6my?oG=A?-Sy}#Zue$~8IK*@Td-w!iWG%zA2y0j_Ua{>bE7s)F zE~Yxf*(!BKyCDTwPwJ4CVOO+tbLh?$t+-jz&%VYLZ7iYC73>s4%h~JNskZ-*jL0K$ zb?h_F$tdV8@MtoY6?O%`jW~)bI_k>Socli2j&-#+YfsZBRzBB4vkf@qBI-DfC@JQ#?4q zrRqj8shN0OfL=p1F5oRMLqx^yzCvn{Mtx7P)lH6Z9{Z=1f6*UU1GrBt17h;3CLZWC*X3=4VpL$h?7f3H$J<7~%7^P>O z^jRuB4e4n;C=xM|#gDMKYL$deICZzDJKJXNXN?PU#L1A2?UvIj*si zQSmOhd1*aLE?;W<4EvnBe0d};U%I`|P4OO3IqPUt`Yye!*@erR#|_BpNyvm}2FFv_ zF8tm650CHaUVcJ^-C3Vrw=b>T~apR#goYx0i4O_n2Ut#=cVie+{Ca3k}#^JvysYrFTp zOlw-rk$+%|z=IK-6(1xCL=Hv<@s$70%V=4$Tlgo&E_;rB>=}ojS+LoPO;)Ih4f$s6 zU>_hU=h@hIwVSMIr~w6eP~@kG4*HQ`|1ZteGT<7rTDQ1ZbmjJCvl*-jsLB0I%$#kR zh48ax8|SEsvBwf60~hLy5T~ zB@Qmb*!nTJXeGwct{&0SK21{G^3s+z34t9>DiGCTD>CU{OVW<|N{8r(WtCt>H^hd{ zWk$8J*}9uu^^|0fX1st`p!Rfz>>>$|N`c@-?QXfR6@tncO=F{EMX>a)E1y9rFuURb zjiG6IK!XDckz>zjx^PA_iDPTN(m3^HQJ9-OrlDN6UJ!a_Dd&=U(2@?3+LM|v$R5_D zaahwCS@JoEtyp_rlZF_MD9p(o*<^wvn`g`DrAuW4kB=C9|B=o3Z9%P)?5Ry&(nZB2 zjWWMKSKKgbS#cbPJaJ0=3C40L*XCTQ&3y2%Kw5+5v<4G*%VrN#?4A9YzZd(Ya|3h? zVCn363hii4T`msLqPB}QYbZwe3UPE+;)uZm8qKJiWg#MKXx?9P3RpuggQ1%vOD1tC zrM9q!X2rKaOp}TU?!8kr?$PJ-j7pCXYXEUViA6D+XQFSO3FO%jS+WW{dxd!>kS9m& z8dxDD>EDtahI#e^*K^xSS1^|OYeDOxb$|;A_>WLn8@2IXnOQoUwOGFZrJ-1L z(@#0Qlo?OhoN`7xOJbJU(huHsqL-OPr0ISZfs6lg)%4W8-QLJCA#qm7Hc^+S#iPaMp-9uP_X9mP$8&1 zfuJjItl7|X&5#Ua1(uZzbOko*1zN{m*;mjA0crfPVL=7*2bSED@G@By=$yGup7->s zwy>F(fNrJt0s5E^H$|T6aRY^UBI>ug1wv?hbHJCPFc(vGiSKFcwd9=v< zmkqkEwn;%vocTUN5Fb6!2R<-U)H#QAPQ~UNsZm;S@4N;b+@)c;nC4VL{_5Vnq1vkS z65D9GZX8*{a~E4uZCi@gJM}yzi=zVwqC>QYn_@ZqhyG za>%nTJ~AKWP{P;a=ZBI}GL-1Og$~(=2{nvIIgLr#yAQfaquM=2M4cRBdXZ}`%nxOj zql^Yf>ctU#p^cSVTBysA0$rl23u#cs!G)w&vLKUsA+10cA&*@1Y<`Hd97I5uVJg+j zOYMO%LWSK>d`)&bbS+O4vXgs>LkhN!r{#EA4DbOjY`zal=)D0DJBk?TRiZajRY#)SKTC77B!j>>o zXqJr&ywSD{(txY8kknQUp1e7eG9Omn&4?G1}fo6$yS*;T<(z7H&aYX_X$%gm@>of0&!AASYG+E2Wy2;9*SxLASMC;7x}-fRh}#DPTk&ctb(#YGmVo3EmXFM z+4-5kFk2E_*H2IIr_G8qkEe3|;cR;spg~%fyca$D~S0Mg` z3@ma3So8gRr_iyl&h7nmpr57VaH4eWN=HEM=Q`3YgS?Qt{lwNOlrlHBi&Rpez)gjO zTY<1WiivT&aRpI$Ata=(lSi-2+<_(Vn2!^+AA3~?Sz~Rjl7%+)1cjP^VPnu@<#Cjh zNHT{!v~Jy6Hv#8+J62Y50zPwndWk>uX}8Hy!q{ccac3iVGVr+sZqIRLx9kPo-gx^d zZf|gv7HhGaIn7euM!=GOJJB8P;r8J2aq|wMZEb_O^bs0C?zD2(l*CyZHt$3mG($I8 zLYsSU2b#MN@?I!?Q1&RiX$G*gh4FrZdGQSPyx2=^lviHRlPp`f~tmNB160?^NWG5U?mozWW+3vS&lV0V~Yu}odK0d@LUwfZ@v z*A*Ztn3Ziel>#qnl;t66U<^q+q&Ks6wRRSd8zp+zOAaYD>6bT&p35gR&rr zN7z!qt?J0)<2GQui`s_*tId*kCO6mIx|T~rO;zIw6OmyKYb1v~3&9;&suB-Wx#(_Y z9_!Tl5V`JVH3&mcce%O{YPau36+-Ryon%E3q3yd}@8|a2m#Ns7vVGTS%VM|h@Ssxt z0@?t3tD3jFDlMA1Th_=e*uMMovrJ&GIcV8Js^h$C>;kg8O7^uCGPzen>hR7DUo>6? z+3mY@uzfdZBQ}nuEGXJ{`Uke}uIKTRO0wH`c}dIhltjOhMwy|f0;PM1O~@$93f9eE zRPcT`i`!ur0&R6$?$#w^&1l8=asyhi%Wzhe0g$&Q=vU@&IFHq&@CooGzZJW+=5j2O z>gujZlQD5G!F{&asF%Kj$u_sB&i)Fv*hpk6z-_S+WGldKv2CO?@qjiJOQ1x(w%8V6 zoKZ)RDjY}Oa1A{g)m0E_P=Hy5q?*4#!Q^aU=bfa*w2YjQB~v-XhCM-;(5=*{;L1Y5 zM~DvYB@<2Nwhtjo&uCZ2zN4f`d4`I7lm)dJOqCLI;PKCwu!t{YOSwef&rB)DuIowgA;Ao+G`aG3x0rB~?U*HF{ zQ8ZFn=JmjApHkBufE_w`5hC;`;8ylQHAR>7LPr*lqOisl%@{{Q&#HZKdys`buJ(jv zn$lOYjamk63-s7P%B`B|qiYms&Ku1~*SdMn`XX0elI9LWrLB&A|0ySQvoP_HhiOPzh7<_;{QvbP*!}I|HF^w0e;z%&$MzNL{+P<*j zljj9gPTRXTpy@S`YzN|93G>zEbJHi!^uEYj^f=Yb?$)qjX+igX z3^=_xleaG+JKPqXBKk_wZ zl_~#JF**w8ACFjY`do^|N)Jw-yTOhx-UK)sKabfSmG{>nbp}$sh*M)X+<_HX-D5CV zyJw^M&iY_F9P3<=LDnH9tH4;u!g?Rif0{zRwoh=JD?Db^R8#s-~|tSi1hLX$rfx(riMOW$zlc~ z`1(PJi6nk>GjC!$sd9g>@gItGhKH-=u-YjanNz4h<*ad>gWcv?X2nT}>1lNcle+kImFq5W zrG@Kb%S9S4_P}+qa=oWqSp;_|S2ei0g^Qx7A!*8#>qzB#Te;pu@UU_n1+KFDST2ep z7imT+*T%~AhI0K8L7Q@I1+EI=q9}5ard+wY)EciU*DDB~QLeSahkFU(q9}5aW|VT> zsa(HTE*kj-=-4mZ^rPA>@h}bi0u} z>7PtUhhKrORfP1xH1Cg{! zH9~&C_RAK@bH3&|2f>?~=MLa%7OsVsi!|1YE0t@ua?M2Wj&cn|R6DV^w%1PV-w2}* zitd-+OWmWxq9Qg01eIw(s2A4#DI`exmjeRCr3gMyvES@C+{*~p7RZ2HnsiXsE-lwq+N9Pf*Eq7r0G_!WA72J=alOi1ZOGN!&?vceuCz<+P@Mp zjy!iGtkgzv7V|=*@a~}?jz43!#-Bs+kVqSC%b#D;-(RvX+`t`B`qy^iDZD}#Go=K%y3iMH zd?(cu?A!N9HG$+HL`2zC6nApvcI4|Ml~TVTF?TzXKll`FsC@~NyGCoKEmF%xGffuB z^km6&?8SHB+Ikt{W(J-}(%iQ=9zZCBIV<)cV%Z5oIA8%EGX0fC|ezZ=Ck zV5bOdY&j)H5jSQyCE_AH=;Vm1!_b9cs4t~@Sg9XrMde=}UJ<-e0GqnwwTRD?C>cw$ z)U(vC83;nP0+#geB^n9{2!1#OqX*`J|NngB%OV^{p)mct@nxmd3XS#zVzwn%2fRiN zbqh&k|22l^#l< z`R#en=%;I%Ms(iru6D9hq_DUx{A6?(AMuDiU03_`fU2GFx1?%+{Pn7F`#qMODs*_} z^h#KgwYYW0uJuyYIG4X-HBzrONd5GBFMf)EqxBrsaQ);o*U|FZx~RuFaDNPjmKZF zdI5OSvxH9G(cEl~c^3vo9dm7|8>H*j9z&|xVXEI=AXEla#!(F?)wyA+-D-p?3#zQ8 zLgC-P)fN6t#L&;$y%PTRVB9q~$m)DrOa3_NZHL%TTU$!B?GWvAQJJ|~ay>k{CCwM? z5VVr)=I&3S6-+fxi14~X@$J3nSV_LLy_LJ3p4pCogP)Duf<0n+=%xB6*xYFaL7Ul= ztaUvDBexNWB7BN#Bq-VjLDAM>9s>Ah_}#;Ja0dQ8KNj(S@OIqtFQIU_X+*fn7NDy z_8~RL21#yg$#0=WVG+KR5?6;$`%Davfk+IGe#aVKo)SzCj;BVMeGlQ>3jM6SH12Xp zUYWp3!E9~eDD{$Gxl-3lEaY|tldOMhsVhlTywryi9rP*kCg%)h%W!8~(%p3YW^qEV zsfHfw2YP(FEZn)FZ>tRYw$SUN27io+OUloH_(`$UYtyW0b`BwsW&G&<2Z8+h>bk3nYBt+_zbN~@tLrH) z#_5)@nGKWW{@<-H1jpp&CQi7}D2@uCA$$(gEdd_6IEL z*bSFrq1=hvP_`ai;|Y2(>05erT1n}!vNo%Iyrn_tqA4cllPQ-Cfls-^+cEa7$w@6nk|su|Z=-d#0Uwwe{5II2^3T%m^;> ziX1=UHOv@=0kE%+yNB;AK;NEQ-}ZVqZvxudT<&&}A8EVzx(P3HLb^+Ap7Q6T4%7i= zAXeZ2+9R?}qF3Ba9U)5c;{C%8MCaS1tI*7iqLl3;KSm*kX-TE;=rKcj=vhvX~v$ z{L~z=k5G2EH*qyUoE$&LbX}i&7B6oOcNvzYTUW6gM;1ux9*SsGf8r z+aVSdGK!8QScOc{f_?*4pzlRVqNHlt65)3i|)?-US(zOLx?H!<8^$kT-8s=NRTv#&*7o4Ww*`% zS^(A=z_5L_YDp}HU>mFY1*)-|g~qMG1w=g%h~|#o;SK~cXiO);O9*hu200jHXWF^j zZ;p}7rA)Z6$El5*pKYsZV#}{u+S7wViB`J-rv)j$ z0eRmo5zU(g!CCkERdcVyH2-`A06Qw$EqhezN#(ye^FmC3i9H4{ccaXsq^E zZEnW$N0;wiI{m5=dQ88p6TfNZsbAp|YpiJ{m?KX_>mOeLZh$oM^YF^6m=s}_uz~8gPO)w_zid? zn)t&j)^DE^BRF(Q{F2)_*2vR^KI{)?^F3$!DuJfwCC@(o@CS@!AZdZ()*ld6fB1By zaJO22Xf6w0p6PplR`;qo;lqGAH z=`fY07rme*wgs%?5fa6}CC{0}nq*wMRNc>9$;)gr&wc_{wPp{(01_Sz= zOAH3O>^Tk_ZnrDn=XcKfg!3+cZBoX%G<5H8Zt)V)9sUbf;;4@|Tsr)R5pB@ugNU|j zv<=ZNjn*UT{aR>mLUbgfDL;j1{%%SwQn+5gt4<3A5ghqX6U+}^b*hBe@4Ma*0ptMzcC zEO{m%l6lr5;*e zbcEIjn+csi0T3WgLU5%j^HUTdDnAp$KJKgawjx_uZxZo9tw6sNRTcMLqbS!#q4(X;D9)4_fZs64 z*<%V~w8td~g&6DoI<<$V=1EA>Rp~;cU=RFe*cRsy0Xs0zDxD}uHi}r*T4`UYch<^C z#CRZXf9ex(FCS-SLF1FHknE#iTiCY6B&WU4y7oGsTJ zyFUy7%yh-HnY~AFxZ%cGCw4e0xl{IG5BhP?%n%yP_M?*|Ju^thCCy`?m1+2p`6xJ} zrVuFKVeYg-W?3fu7*HGoO{aNhb8(P^sH$}HdmA zMCXkf6t~J%WvZsqe6^!YQ!p<1bAp_w7Uaxxw@JDkfSoIB1uWL=$7uFxn!(m-Moiim zOQWW?)9kYX!WvtTVz}!h+b9U5gL&8+c@nd^be$i=Uw9A#HN{tF7>#A5AVanlmaE>I|o^Z@lXzCW>6aP*Mk||pq8t} znEVydrl-9eVvIZ+lzcP3fu5A>=8+u82&3ES!sDN!C4t!K%6&-{kfEHr*d6g7%y0@b zJ4?zN;S$X(uP02|rd*IvY|FI6&3K6#LjYt-LY*29_GspN23)6ntW z1y2xIkhN@U=d*?j?V51TyFFud&rNc(y}JKz&o(E#!8vQNkMe!F$vFZ>AU);lj_;G{ z^*f?l0F|Y%z9`?U{c|{@K1b3wYtz`_QfZmRnnnrH=$T9M=1!(DU`*~6fa6=YX2-wty*c733{At(#PNuP3YUvahz4T)RMP5+R%o2)oJyrANnGs{F}M`&hv4QHR9sDLZcY`q{{e;}32WW<0QvlI3b8 zQT`k@^9a*=j@V{);1&#s9t{JBS|E3uA-*SE{IP}l<}O$18QF6VDhU+sxiF+~ezk-d<%_ED z8z68B_p@+lBRa3J8!EE8NzIA1cyu~H(bQXeL#lSbeZ7sU@q-DmtnORu^2%&H95v6o zB)b!3H<2NyI&C~mGX*8*DcmB4i=+vOV?TnL$Uz#z|+!nGS5ljC`(AE~~yDLJ->Cb|o@cgXf*L-ayw}&NDnRR5% z4jBF1tRrhS<5);^Fzd*g&&>cYcQ@?}xm{K+{DjHBAi4H<#{Q~^!06J;OWDjRd?TQA z;6bt85^87Go8)94w|w~{tQ7XPLt|w3%+G^^fA~C>L-H^#sNN+N!Zku2xEwAX5c(dV ziQ08LR`0^p`$FR~+|_1C%m={aNX*3Fm1(1@pZZ3p|Tr#+T zE2ms%imU7I+73z7-l7*!H9d~fKN1-e(YT;&avbL)>9qpG1lsigcFe^WTo+D8FTmbw9(#J^ z3Z6%YL3QkNH2!P@B(9-zT&nG^6ayI8M9}#Tu;rDxW&-xasi+~ zt?h!MtWPa}N-fK%<*R&ORH2qhoSo-3uv(S{jDyIyL!gh#Y-ZogcBJ$ur7!9$eRoQK zkYXTicpz?4sWy8jHbSwDg9ggft@=n3j|hkz(MNJUprD{T3sE)vueNPD;+{DPV_EJH zf+1sM2yJe~3MMB71ZFqEu(Ev;?ykvDW!Lu2Y!48vtYks2;>)rM%{VTLg06xF6t`C( zeLW`k?jwEszS7GB>3j5*{yvVf*PcUJ^lePywZzEIGm|l^SSxqW_Ybng0bML}03{}< z@0%O;(f2w^nXc1jc{{tO62XUN%B|k$;~ny+{*4 zEp`deOy#fyXo@HOH;E43gcjTXAaqk4r4HwyD%v zNB*ARL0YoywPb0i-{0YYrzOiuVKJ9lUWOPKTb_AhB2Br)PiHYt3@f_r&RIWwAI~bq z$CO0saoa{*=1_r8#4}8>#~XA+K1@mZSkqt*b^ZJfYKFCY!b%iS_bw{TXK2dmn!yd> z``!i~6&?LydEJ!v9VRk*j&^5(uwm@fPPf7ix8<?3yFoC{B3Qsc>tQg6{i&_U z;txpyedJhzdh1bKo0(um92pWZrlfiziDL@;K4XaTheP?m7;EJBl-McL7^448Z=s#a z4j_c;%Y9-kI3tz*F5X`zrFq@)8^EQX!9s7XaG69abaQoEv)UK$>uHaI0{+-z#_|S} z)XM@;0kDSvUgp#Ws9*Jl1L`*;OPA8nOBzPHj>$kibKZ!=w+`y*n#W|H<1 zofEXJJx0>vbCDZ}c5@Ltz7}e0M~|1b_ULqJYpu4eRaljrE6Tat`jIOS#-zY*m{%fa z-7p`o#H}!^m-`7QXzK~R3-t(h1b~<*h>6k->tl3}!!)^fY->I>j0Oz9o8B;UhEZ4DCEpUB#w%jk;X0@4G5c}2%R5z%*--$tCEU$sAB?7= z+m}4fLD?&qyUj_wb(b$;w}}eCHk(y)y{^Feo1%n4lRl@HZnJFqhpa!Lk8Tlj zsOo0gv#OghPslqLIQ5i%$e6nYAV2feW_IqY+XXy?gvn<2Ht1tq)u;Ror@1CQ0I{G+ zM=^wUg0HJtoAdiqr8#E+GHnF8wyS%z&lBCxmZwb3K&n$T++sKprv>yU_+RXQ{h6A3nhMz|Nd}FCQ<8K%=^rJz`_n7&GMm=vP{cnU(N2w?f@rr! zry)A*5g{l?G^)|Dh|Xd(cki0^6I>hlUS*Iez(wubJvq7Hp zPXYvp6A%nzHFo$XBkD2h4nK-0^+I$8q4=!!4@HbB9`WH$UN>~Y`;!3S1+~)zfkuuuieM=(MKJPxi_;i|S= zq~UZ2*`BOibChc~f?btsJw(}KulC=0SJnRpVfMG8ND?9|RHrL!bhUpJI9RA75!yoi zQ%yz#05KZD-YR_(xUv+G^6xkc1xIbAwYDyoq=#lrWEE1@S7$37B@=VHVEVr;w^82N za3f=N!ul&V&>Aa3IBX8)Z_BAKS`vF(uJZf+w!5F(atk;waxuXN5HQw6gDg`M|4{0!Wy z{pTQ-Rq_l%YquTAmh_(j1c){S){Do2tL#Z~wOcOISl{1+#>e|VlL#^G5|L{B06RokFdi$~h)_}T?`5po?G34M39 z-({Q4KM@Ks-dA?I+9Lro!#uZ3(whZxq^?B@_TcT{D~Pc8q;yPGf|S~w3;SlJp8m|d zVDZ-x##P9fp296Dc2_8iV7D+ zF)z|oD%UX9TGD?;x!MuLlxufH2ZCm`KL|1U#104-s82k=yxMjAIVnla~jDomPKY9G&4|VQ=;=jc6J<5^0*b=8qF6pGt(miV6+U! zmV+%p*}B(|K}M|4qOC?urw;t>;kxG%c#VIJ?us^S_LXRJml!;jfYfDHn;E z5l;Utk)`~kvE`8+NW89pe;fz6tjprb7uUTW=MoL?e^EV7f;R$^Wg#X=rg#?)o<=dh zRs^SiO%ub~xDs4Vg3+<;C5MpYlrV{8p5bA)9(*;ODp+~S2L1$J99N!O!QlX$rwh(K z5OaGd+cSs(1+QrYr9gG_v7+0hzKPL#x!``S@3Vv!S!mt4=es5Z{CVBDTe(ry&P6ao zs_@KD6+D{m!DoILM-;~v5_OWdr-quVE5lz|GTd&+Ez$WKDDMGtnM>-4}m!0N2D#+g|y+LY#Bw7PsLUl6D4(A&!Q`fES zRCk*%`9I_G(Q6T%MclL%j@YVva>2*Csou(l%R-CV3Cwa%I7>D*@!?J*r%KqDwq7__ z$Sm$iNzWMec(CbsZ8B`P64?3o= z4~u_Qn}s&rKy?SpxUxQ(>J8H@o1;?8TVeXSR{Fg+PA^g&eoRLH2QLZQuy<}zS)JNj zL_6yMGj0NGj@p2EO+UlkPDDG)=Z}@M3t@DatP{t{N>tv`dL;l$k3l_?5%(sRZqlP$`M8yrUHPQVT;ulmz3?ZFj+TKpWF{rj};?*L< z?pBM`1{^gbwMASJ+#&76f%-_6?-C)BpC;-wW37FNu-Cz1c*(EF!)abs*mbU((Z3yM}~j3L$-#H%qjyi1L-IN)%`xG1<3 z8W^Kq3ze2amFry_l+eH8Bv+_kNUTqxFcUgk3v>nviWg`M(fI;p8v?bWc&ytS^O+5}i>%L^r>z!WrR0#DXrYB53ROaiwZC#CVbyH^hEKhYZn34eDy!JUdxn zT5Is=JG2I`QHr#OXS&%1Fs&53Sc)a2V5#cTWteNp{ktunQ*KUX1s7`DdUaabavRz* z2jc8?LWdW)$q+J^6P09#iH*^Y1N}MtLF~pcH!C+9a2~4EO~Gwa8kR#;)?TN^bRaqk zl3C>J(!44>G!@t{1%{?{Doz+lB*!LfTQ}(7HSk1d{ePbjvVJtMK3wqf|Hs?Az(-kJ z{o@N{AzqUzV7yeLqJnsdw;Ba>L04A=O{*xjwc-u6wKi%Nqa^}{sOuUc2Sc&qW+ zt)fPRu%MFE(ss4jZY|Z-Vx4qpO)J*eQu6zL&zX6iXEz(5@Be-Od^Gz!b2)R)nKNh3 zoH;X(az2X!Tj2c5%=S6&X*LPN5Q(ctcjL;zmEtRgFA(VbNOA7-t!$#E8shk^Fy#E8?|U*^7aiEl}KKYZjcKL zA1)0{qL#4hbS9!494?PYQ5SBqgSdVXQ*w=(ndwJ0+eR|&wNWc}E|$e1KuJDGdJN^} zH9ZPWZw(~I=?!+Vf(lJ3KoWh%RfIP+w#Q9Fck2*lUCz;{^`SDt~ zGG3-DBm5h6N({v>Ee}+ARd^TP^w$1t>vQ}J=_3cjSEE)$YV|V_DJ)Z|wZ13~h5xCw zKEY49){3B3z0?v=sKqi>TI)P*t5<9N6+b&_tzA%SF=_#y-^7GOi{0yZ1BpEBx|A8o z@F%2HNoNFd5^d{e_}Nw4dKR>21jCnXEtVOpwO)|U2|uf~ zp2E-WT5BF^g_e?s1jV*krbcVc)mrUZ>oNR{(OO?Yts1FCP^`r=Its$4X|0E~)`R#t zRBMevt(j7bpjeA#BHGsXwAPQc)(`M=tkxR+rt^`0oKYvzj!0PyIN(~#so(~jNI4NH zdw4e)9xY-+KJAF7z}euLRHTdw$GGW;v4Lc`M>q7b8E*_i;=YpUe4tJ(#b& z@nV<+jaR&gg%H9`W--|+>hV&$b@@Iv?B9vmzOMGzzo+sMzKD^pFO$nN?E+Kvb(y`d$(6NX0b%h&7I|y(7Os{yq+vz#hU=o_Nu9xAF^*W(Oxa3<5Dh6 zwByoVnrKJgOf@*N`GssHDo`&ruS~y znE^Yq6?eTx5D2NWH(|nd5f^Mq-PO}`3f{8xk8L9ENSxjVmJY4d!wM;SrE%8a!ua+C zRfo5H9iQlo#)__gVr2Fh`Tgqk^jxIqROUO6;#T9?e1sL5g>|-<$KEogS{7@fm*t{q zB-$&ip3|I6&tYnIrqpeWI^U7yFa1&B$EUasyI-CHn!)R^F72>6EHHS7UBK+EbeMG% z587dL6Bl&Yc}fFk6|aM~++j}>M2QYl&u>wO9de(H0qI2<1D4731DEQU3q9uBjyV&{ zK3iv|m!}KdGb2O9}C$(YRCL3 zA{~=KOQys;_8PNYtz`HGzRCpo6rNyU*t|Ui+zz$$cvHGQO_jM0$e#m za*TdcA*UrN*|czJ4W2YAbDu+CpeIMAPGDmUPOW6!BUqQOU6D$ugtQ}V+UiJ^z(0!b zJipa|ZA6Y;9w2Do0m#(RQnabfT$4k;Nhs4o7X?0U2?Bj25E%u(gn}zVK-io*uw*}X zUJANA@4;2C#6n97;0pqVKsz-hUl%hYl%%2u~gqL=b=cbp3&Llmn@mURo^FA!8=X>MHjA)>@JiYk9Xx;#d|>xSJM&F^_=i6 zHNh+Nmv@7O#z_otgzwCcG8Qf zyq#G*MwtvT2qwG-MZS)jdCsKg1ZF~ z*!N^2CRQ9gZP}613<#5@hC3G~AGEfx#N2XjI|r+_7#93H*MZ6)@P>;CSgo-lR6buw zR5Ve|CONg%!Hbd45M^UePEg_H)bet;O|ynl&*eJ)a%w^qwQ!%bP=HTG%O6N209vEV zx{fxfJ=52-%x0fjihHLNqntK40g}dY48g6K=Xwk2u_5q@UKi*p%!rkOyy33FnQ?+> zkRUTo6A+FW5r_L!G6Ua#I^N0luJRNx9V4PPAZq<8YX3NHi=y@$W|t5(YYsv?$oXbj zEvOyG%dU3kaikngHOCIs&sGG72&qsp8ft-aaS%g2v52(BYICM2L+4trCa}5!g3nT` zOPbX%1U6d*XF@bbi?3v}x8Es}U)b!#?HaHJScJ>O>bQJ1h6W<%9aZ`7r~xI7s{JR8 zhVpl_S&bKP^2gc8QoC!(W{+>!ePFYbDq3W60=RPvn!Yg5^m&q_O|#({gVFoL*8hTD z+2&JFj^4kh1=W{-h|OT;4ZU0~LL-yISVg}PgyOTh2L%w+;D!>M*sc^p3)1|cdNilC ze6qf#WTCe(eAOd%%CSzYC*sLd*`7%6@h`Eo_F=KXwP%RgB}AGAsnX<&^h`wp`iv41 z=+qPL_-}cupd4@Sw3`CT+l#arpH}eWVo77Ojn!%g4)e4Cyf1Y!DlYL0jnzW$77U%S zKqOUbKy%uWN z0e=r|*rSIh7YXP}+cb@$o`p71V;LMLcq2J_OGedIQoKaFzrMXhyAuzsXjy9~u5bGd zA;2t}yIS5|8`Xg}zJr{XBfcD07s&C2fs*xuVKccTHiIY<8CVL+p>ww$jI{&nn!%cR zCsB&%!4!wJo$XG)YwAGT6nS#pU=3YUvY{=}qo7+S1aYk0OyGw&PU1w9 zzFnf?;{2YzD$OodPCamha4G|Km=fmeTxNHL*B*{5X6e7j_mJ^e{t6zG;Z=C_&n7Iv z8#YLIHsJ}$uxs69_=l3S^|J{PfZfvBgqSodDhFDA$JghP1TWCnKbxTCN}f$%6Fi%c zUXEXPHUZ!MzFI8P@SIon50ya(R)?qK3EC-qEqus%dg4UXVpAN0n zi^pE6MNq88GP`T7Umq$M)*=NN$KdC6t+fh|)nMxCFhQ{v%T#NvC&-aR_(-H6<8b`E zp|$SCW1Z9@DAr<`v0Cdot#t@ekTDKFztUR6m+l`Ljxspk@Ur&OCj8E0mnOr<5JU7* z4M>1c_o5t=UzAQE7Ej|Tu)h>>Mt1GL!RlnVRa(`ctvV(_Z3ztB!M&Q<4y^A@$>}c0 zq|eZU`dyXNpA`)NK^^s04eE$#B-WF5fLIHarU6Ezg!$2O!YUrEDXXEdThP2Yrin94 z_@5*TW@;k50Z*PiH51rlMH)}p?`kHLh;HeoXd2+MmWYfcA`K8v2#=I5I+ZOQUD1tF z2%2#pJirt9G%js#ZfY;P{z}n`Wv{mZz8+|-MhRO%kB9Gv1Q_5cv&*DV=(eZ^^vHKT zyqxzBM-f2ZU+WITk6zR@MiXElNd5u*3zxgMsw!_NW(q`Pr=zQ%jo{x zbR2e$K5Y**%NCs+l!IZ2n>H3PY!U2x=@7@hXYfQHr^mvG6M(ex?hY2UCTR%)_%^eB z0m$hVp6$(XFwM}~XK~zm8 zg#{vXv@+0l5MkmnKfE~5GTt_R4Ptf9R*25(;Z>(!2 zv~>Scwqka=8}RII%|sTK?`*apl?+Hj1linT@rX4JH@9}nXvDEast|4Nh5P@3C+%k7F}8dPtSlX2fFA#Q6<#^XJNYX(KwN>xPw;Sz(dcWfcT*6#y^ zZ8+zt^seAsAj^p?cjC!oQGqNcrritLJB}nygs!KO^NbMTlWh*P&h8Y3xTGg6g$5lgZIj@q5e$Ip*Fux z+hN7Au(ct5BEh}=8MNHjBR3cUjPOVkkbGobxX^MdCiUBB%qx|8lshe3C8q{BTuGZ4uz>{c%PCls?+`dt!%vTR| zLh!OYmGZ33)821m0Xt6G29A>(m>n1=|6y-1Qn4CslJR)yGYj~V3{Ul%oq{JTdo~21 zQ=1#N<>t08Y|aUre_La-snk}(?;YT1d|RGM(fDg^bO{R#PU9kG2Wb3QB`()1v~qrf zjx|{6*!7^8Dt`}V_Kmo{3J`J#2m~MSk=xkOmxavlZoy43kX3MtTV9xsdHq}iKS7#9 z1fZ6Tu;iV}za2f2hT^G^e}7a`dd6&#lsA}dNwIt8xfKGOWbn3=$aZjqH0SW;F^wHY zw=H5NQ5i`*m9P+;W>pksZ5f4A11ONv9-$NwrreZvJdmhz%>iPqjrCMxW}kaRdcz(* z|K8tYL-E&75&vWr=WkI6y_-g3r7XUenC*|rjCDrwo*3VbV4{wo?gp8TGwP1QH1-79 z=SxRMeNsG>0}CxVy}h%cd~(QKjFAW=dQmb1OGqbW{kEID@~d_&8tt1=zZGpf*~4;> zdQCm_LvTXOTp?YDQQu7P0Ii-Xz&ehwlHqsub6uCglc((?&afNtA5rnov)JGR;9h3? zB<410mvx&7&VkKAzN;V;zT9i_f|5<{rcFk++~mGRO@1a#+Od`{8f$$HpFHq!A|%7; zUy_3XC&S22fv@lDnDPpq1~TOU#qa?ZvrH*5;m&1tfGG_^J~3>pHP76L{=oSMuca>s zTdEWGbJW-<`7ddUhitjUoeEp@l;7+?%aAz83&zU+Pl>=m|AybLcJ%&2o=R!L(-ng! zSzvIQlg##M_ApQ*Z_##!3# zO8kOxh;at;j=_WmHpytd6$xTuV+RH!P+l3#_(MMi>KryC3iNb&3UmNwt0u69*OkbX zC4J`NONN9xtJRk7Gw0yVlTa<3oK$xA{(y)5ikF}=ZLZ%d+3S`1cggs{`*H=d;rI9= z{8!5_<>S71Ebo-Z1Myg+kK^$;Lm&J08WWnQk6%P;yFUH{sTn>d!~e!3++I~=NizIb zyjjQ32h2!@j}q|`$4^Ew>G=xp`wRkbSI|Ln@YCw*I0(PAZBQjgjwQnTA_YbF#?P%J zuPgis9%rH!%3P(*VyyG+8`>;y6F6HkJa5~{ew&j}oBvjaN8@QI${wU;s}?HEvGVG$ z*h6ZTL!pnVU`8_BwpNbBE$T9*;u> zgEBsm5BRN43q{Yd79DDe%v16jiYUnYr9E+|-NTGzxS2R9GV>%8e8qRTw3cPdiCT+n zIa)G2wjAK9bcJsL3jDV^e4!wf43}%!s$RupoV+@=>?t*cEtSkjhJU|@hskCNeJK}y2PvTZclfzer8dnBP@dNIeju-|y`+GYNb`Bj!2JUJQOd8D%dBFx&CTN5|8lp9|(t_pSCu zrrKSARx&)$P|I8}q~$1fAyyL^O1} zJOvms6B=4JP?jk=x3Yj;4%_}oqY3BTxkAy=F2gEpHilme-W@`RP2D04LHf-|H{UAn z?@xxf%55eDBsa6T&&TxcOixaFV>jnK-RTG3%zA)DRcF@p9w=&dC&XHF?Fi{>bUr%% z^$w|GfCh+{cqmLc{DmjA3sjjr?!oFwTNGLpg&bZ5C5ytT9tyWJs8zOeMm=0bzF~PP zle?fGuU(PKUkJMpz%MN%&_ezqQh2L^&lZ6jB*uG4Nzv)JH+{UK(T80@XYo-4MHGL-{7?zQ+WdGds3 z{suA;*K3UB(8HMO)wWO8w$ntX#1KC~+h$!zRa5U$PKDy`Fz;Xx$6A-y0N&DtUg~R1 z#n|60$hAmo;vas21Vy2g^0sj{T4Fvoj-p5uL!!S4*>pxG;i&%O8^W6vSWWd%CY4h zdGb2;|L!!#FR!8y2l!tDI}BJA#?w8b;hyw7lgOoos1&^Wv#8Zkv< zmo205$*w|qF&dduNI9)6a~-2l*{hJ6sYp!F9*VDK+Q#rE@+x}#Yr5nYU= z4yzAR!qHZwCBmbWy0j$uOiq18QEX#NxLql*e2lVuu8~wV&||NlfF!!y66&&-?;E9Z;a6MK%tA#B@b$AzUbxsK}^o`yBr| zkv!KTsl)dBFAAodo&X-R5@sn-#7|=9(F%yb=#3)_QDNq>8lE<6ctoHsjro8=~!(kYg@`1OxOS} zEoBV?uGkW$E?hiu9>H8t0!*34eQ(f>(u@U_F=t9`9OuApVaWWDh$`TWe(X;!=n>WR zex;MZ-^o)z0;?f`a8C#BHgU1R{|mQ&?4*L^qACLM(wC{M$B2&AVU0|3lZ6`D`lj@)a9CPEE7^! z2#EpxsVA^Q&-yN@k8`-7X7UK zO?}fx2O7kf_cib}i?U8WQqO6>QB`G-o_e0|yb7!0w%Zh}E0RHx9E*HQz!n{;`aP}; zmi~8V;4mfNtT<};2|9UQrC8+vj&hOuHs165@aYBZYkQ9ED8)9@^KIpN>S|Wx+}(I6 zOMge;II}P;d&8V`SE&)*W#doe7XH*VTDZ*|_B8NR!|#zDoc#Pio{Hp02cF&Ze^uqE zo&^VA7Jix8K69NMrQ>WJgVD;5lPf1j>Dhvv3`m_VkJS-SFyd@aL8(hOq-{^-{GLkN zB967`>jkb1ISeiHaGQ!8ZTkJ?+P3jf%!GDo~YMsPkr$jb_wo0Yg%l+dJ~>eWllkrZ*!kR zO0=74(yuJtW)4B=`~;T23FXx|oA#s+ZAS}ju0m@!HC|?$`B(#s?%&Qy!T0dw%@s36 z^+N4twC88D*x)^X9Nj2QI_I!tq(E&Z*B5;d({+MqR_xxen z(YGiTUPs@G_xw!A17w1@S;_hIg5vr*#tS5eXI;|?0^pb~l9UTI#5dP7iDNn$t}b`X zA1zOTAy|hF=*HZacH1X8?TEjQkdC0TGIsvUiNaIU;#bV}=Q1}0bFD%mmh^kM)e#it zolF!tJr{LycWIfvPU>^>Jfm;n1n}fE?g>xYJojCZ)11VK!%5GA<~iOyDPr1T?nVI- z&D=e%<>w!F*=cjFt^Yk_s@yK}a`B}G<|e~KNsCNyeZvEyNzTY({qM?=KOhsLnFa}^ z91Y8u?avNQ`DDJY#CL?`P)P?H!un#nt|%7P=)DnmAYZW)yu|LdVb(!tnb`Y>1@4^M z4bT-D9dN(=38{?s=1*kueL_6%jzXg|$f;@fHgWKFdGPY=|VO!mkqz$B@*Iw4>VWXBc#L`mu7U zH*^DUGEB)Uj=Y+B6{8%GYSZ-$9(6slr$?i#XN+l55>Wso*2{~K*q4tJ=Kb2P^>0j+ zJ>9@Wwpj#&M@P}@=X!do8_gnt{eeeq_R)uhwOKHeWwU0uHj4sy`CP#2k|c)n-(`-o z_sdgY;LQ}xXD=MtDReUU9&Tiz!L{G{%pR!y9B0!HDTVFkL3hv@-SBV$XZ4j+z-T3r zoNX`S>`LDHmEg)Tjw~>9f1wJC9KMWJ5-B`=GV7-waqZUfemtG^pBd&Te?*=<%I9yW zhv37H*Ct*2!b1MQ$lhC75NGMZN7=c|wxdj9E(ZAT%09+Ypmq6TfDL%{{`NOnAY}d} zsJ2Mk0k7U&x6`ZF2fx-zvyTlbjbnGGMX=L?glJ|-!Hvo2M!#T#_&EM8kd>UI5NCEl z;F0jLnfE`-)t32_*n$61Ea*_g1*ilZJ1!#y^plvld#PpRQzHDaj2iCPdM*&Q3=;&9~xLoJB` z#~OszvxXgxgb@m2AwXc_4MbVC2neA)elSaxOG)@BX8&FKEyb^-F@wJXvr%E@td>b_ zkBk+eYG}Go{)#GUyk%YP4qootnoHw6wW9*fxKcau9i9=$eQv41I`%XXXwHJ&uGG$2 zilZZ|rM{r0x(TyFa-lVFE2~5wr7DqPnVR|np7V29ZWos00wB)Viqx)J2%+iG)JPT* zcg83d;zg%=xmeB|+q=2n3noI*(I_CF*_5j<_?G8cu9STFWj>&TAr%X%C`v9Bzf}Sj zu9`M70|~opLe|`B6ZX)AUh_|mCY0Dy6O8$g3Anete}7;GnF_y#r@`fKlFHwMEIzpW z&11GdWekwL!=-h2eToHV>M4{x3H6H8dzfNLo#=1>P>HV5x&?9z*+CGq)Rp*g40Y5! z!qGUy5`ClxY?1=YIT<*bIU*q~`2o`A$YLW$Pj$lGEyvJtOXO(#R z`KzpSyp#bVyi9t*SyoV(s$4vIJw84|Rb;QRhzKuMq@RwBc+t0u<}pTlHsotj7Z#9@Z>EZ6d@opU6DCv%gBr_Lgpk7 z86YtZ(qDiCa}|k+ip1|WIV66Gr-4XZqDZ7z%zC>@7|(YzJHV0Cf=D#rhQ{%@orIi@te^>3kL&-0ZoS*;_Ds&QZ)^s#r(POnwB+PbEQtx2=ffUnIr$aM+u4cEJ;VhpFNB`wmJONK0 zi@n85tFm}+78~5G>i=9=?DU&cz?t*e8dxvCJnzD>y6Vp&p-G(az|w#l3gH#3FN5<1 zc?zr`BB{vn*@XgLHN0Wi0q$jnvby!Uw)+4=ls z|4gbpC={9$lBLskvpQ<=uSmz^c@0PdCW(M)PiSISol!UswL z)LVruagZ@C<6XqY%g%F?BxT|d334Xl&4Qd0v8OohV94tCbrFXJ)@i?d5l=I}l@#Cjx{M5Qy+UrB8u*cmtj+!)&m_Kb29xVG*m` zEu(V4jf~2m-V$c}G&s(bimFd|jm?!OZ;jNvpwBVxXwV`JE4-umaZ)^V@_3V(N83klULx~z zwvDX)O(g_e_^OSdTl#~W7_@9WJLnab2)tX}Ywv(t1VG3ga0lG&0+;^paHWMU+Zn$- zT}Jb!PuL!Ow9RRB+|dvz1a}Z8Q=bDsekh{3sXL_3aDjz36ecP`GV{l>RjY2TGyGfc z$@t0iTwpDsq@td(zwjE88R1`Bgc9M`3f6-_!&5TJpX}b zF{i($gy3rs)uc;a?XQ|Ve^%MFj)r>$4kpVJZ8EyzWRU}~IDEWHL|>7bgNoZnyJB}1 z7<~Hq7m2Z0+XY+ZKE+%ozR%wm%)un=j>zIp^U-}QhdM*@;{hSl##;ET5&Z&h-GQ>T zM2`yo|4croqwDxvgn`6<4xS3uQ8Pu5tb^zfrQkdkA6%Gfl>#^LJRy2q`POb8(9IqZ zqIM>#5Zz__=?N)EcXasv-hl92aw>(#`H2>b;;`H5i|+E22P`BgkI&xc2yx2eBzd#P zAJ@rCcnU$wjK_IEw8z=(sv2o=Ftg>HH@u_0r!Ph0969qd_$N*?v9sz)W8}0Ew$XYYETbT&B{#sv^ zddXP9M6e^K?zGP`0YBO3WXlX>9}t3IP72L~aYvunW=K81x&UGtEngDhtML>V4Fd=| zSqVCo6$U40>{bc-?K?_PwIxV?2NLuhY#nZupvXXi9{(Hg!=#u9-;bvNK}8=h`LdGJ z$l`;Ob3U{EiQLT+<(t2!u|4#4cbKr#5|Uj>6S zg~qO2RhzU%)1cya%=Q(#Q!trv(z5P9wAjOL;+MJ!BOKgM$-#mlRPnutIt7n=^ZSAjw;aqI%IsEL*Xu&7zp6^( z&l^Cnbl^I93M_0q)_qG^_X-OPKD+#w*(F$4vu&)q;|~K_w`Ot?>n`^Tm1f;30}5=J zbydJPa|AF{oihUwR|9!>wDOK|;4~6C%-*7X!%yZN?-t8bDc;?ryqn7cgY#}Cvwhw< z!S}@PM8`wuAPq}6;rDi`2L2J|a-tI#p}ZzdHE+pNU=Yo8Cf`D(=4UK0_$+-7vw;^>G=Cix>6o-Q>5-oOZGiGgS1G$u$O&rt zG!_cHpDvXkxWOId=T8*DK%xyb!18&)L7ablCZ^9oP36OUB|C@Q^wd)DE)jUzhzOQk ztzaFm4F{u{!uF3UEnbdL~y6RBJoVqWt7HlFCY%nO5yO{38X221CG`v zqK`H=J-T1R_V{~HMGN-bVT5famFcre!T3=z49q?(TqlJcGP5i)%=vODFy|D5vFy;z zoAC}yPsNQXE`K~GJzg22733EGuas&iKdG2z-i8TtC8A19dhF~1 z@I3;U_Gmyr9#MI;H5@l)IDiXm_PM11PAf|H+n@E z=Ep5?bj6Vd{q!T)e4W)OE^n=30fIKVS(4!i9>zx~#{NP`Fn(4s9=T=)syDfID%Rg%fx-EFVjc8OGRzbrGU?p5(3e&cx1mK?Q=u$b<7 z5o=A#c2xcXLinz-%Bk#(J@fMlJaBqv)Atz|3RwoUPVFi$o^T`bvQEzHzX^W?aw?;EOSkYx&9_6y^L@2c8VK% zXH|(5v$cP67`!1*fliwlT(NFcOdeyQ!RNwTm<_@~x7#F5&y!Ar%cE?Kj0vi|#pbhL zxB+4Z!|}I)SKR02*Cg?6GhIR)TFWyn>I(@XdI{0o`)xvv336R_lj*u4G0s{1z)Grc~nbJjvV+YuxZTT1&jU z$?z#!i?`WLkPPo2=^CwZ`*o%N8ct|=ngzn%ne7PLRZ0R<;c0pFQFwlKF zz8)dr9ti(7J1tl8Haj-K+w2yv#P7h{>~_A^-DdaEHG25A3@K7L8NMt>CPk`dvaZkn z+}B}^tPUTBTqfr(z-ufy>2bWP0e9*p93!h&bv(i70NlpW+hjtfcyIRTcFc0eIXx%^8I)4L&1&iny)~uJ}Vx0rV%6qi$h;%F| zsis~WJp5*~96fB@6@eS_Qke|z`NGi9ajWJ`@{(e$%j;3FGYynF04iiUe#O;i%N0oF zd#tsE1!9SonfU3M&m;>kgsm1_?UO45H3_K@$Vry9q{AnN5-oe7TJv)L9fEsT#Uw{OI4a_t% ze<_v6GP`-Xki)x-<;k4HOu7{lEev?c6FMIRdQuPA4U-h{MjyRKV9`+kSo{gG?eLuE zhmv$@Tb!P*p`8GaevUW6RsqhJwd{6R0wd6&9zmWI;)4`Q3aLPrO`VoN*R~P>s<24s z+g@kwKsu6($T0AYr7^h6y+^?eZ$uDgRo|ttqehCvG=xnxnC|T*U=&9Cx=20vho=bC zUC4QEybBDXy%KiThj{^(OtP+wWfOH}o^unH4K6$2b`~xMHNRr_@ue$5edNID**d6< zIIINN&f>V_5u!eU-V5l>h)rr3D@nEHl~JJ(J_jM6@XRcP5=V$I*q;Ca;hXHt(uGq+VXH?1FD zapyy9HCVKwMJ@@l#h>?z=Wk3-GhHqC=0X4Evu4do%F|~(EB`e#(Y>;7pTuv*y_&e6 zvYixpUYQ%Jf;}Xicw^kE#3E+lyV?9{PS=Pd1W0Td=9}YICc4Q0Vq8AJmkl(4);ylKXef?{()ax<|8~xnRoG!AF(?8Hp?jSY2COX zBPIy5XJ7ByJ3M|dA8{rv*7^d+1;z_Ui8=R@p&~F{El1;(9oDlG6hncdFM`mOJK_RcTQfgA#pz&?fEeZ zm~R8T1SK?71mMqC_*t0^KmY^*a)B?JJ8bhp7v>cRKJIRsg@wN85Kw#ptJ*Gx)lvH7o2y1(WP;A#wD zjz|o@%etbQkQd4y1^^KCa_+5PlHoKB8RAs$CVXsMWAm3W#m&)8Y{VoZc&d8OEC6Z$%#7AUbHA&&aAFTwUz-D9P(M8P+>7o=Oq|hh1KEr(VC1qgX8Xw>t~?S z*0~-_P6G@^2I8ODV0*tSx)xpB-?JHsMP2fQv^d6V5#L1^N6w&W5HT&cl!{;M>lN!T z%b4wd&W=O3NCVTseilamR=fl*A~0;nfk~h9VhWaO1V|Lw#}(myS$MCo?-egasvVfu zZ5>U^DDjO|L`kjv`6Bq>R{QG=H*DD3RDcMMgr;oga8kb?0*o!?RK9D8aWcBrV|;LO zsy0Ue3|isjRLzp|oNTNyRenZIAR}V>U-N22m|+3i8E+QnA_76z4;|^Az)hP56m4@d z7xFnENnH_yp#Is$_9pd;C?uk4(5nVVnG3~Y@W3#zwVW%6~mez$XcLn6^09>OS8t{7$Umvi7)D*Nrjz zpkt)JZ|e*b#*u|E>Ioy-k-&YEtQt51UrfY7k!26v2ygN7fhNeN#F325_NTwGBuELju7vU-gb-@H!k=bfsCj?RxCIJb2f`ZyNs=PiQ0va zwU{yG)4_a+;RW+(bNa9e(R*hXOT%iMrwB+xnJlps-Yh7ilYQX5P+7MT*`;U`clCnd zen(Xc&dEr13^87?3A_RDypLdQ5Fk+W0g@oI3@q>g)>wcw#Q<^8)KMG*z={RO1QG@S zy}STu!~%@~XhjQ+fB>f3`EbStF$G^0Q}{)c^xdiQJQ*F7^bWwc>=V*4-MZfK0Sf8e z81_EE0@7hUIbP+X^VN#_EMd;1B`$a0Jp({&|IRFlybBW zf-9@l>405REz^B6yz(O0_v9z-m9Frw@XCK(;ch%t%hM`6@h#JpKccddazJeQch4qqtCG&ijaHON^+Pw%Hy z?+5K0==-!8kFH{IuIBNjVj9tE)*M6WkfaD~YfanNPb+h2JNaqDUE1e5R}g<_=INWT z2f5jN2L&r$!XAqSwibo(zRA76W-H01qA-&F;=PX)qv;**9YzuI->~nh(iFjYei{^q zrd@?Jq44XL9E=3b(cK+V9XZ{lo!~>5>e6(VItp{HPFmKDDZWDm1CxkfM>N8|wxO}A zX~~9a-;R5^Q@fn{mjl$52ErLuMCls8bP}Znds&1~O$Y0M6jvwW*EvsGfTeiTE7nr{ z5TY%XLq;vdzK>}s!jTKV3rv?al&fTPjb|xVV=a=18?|}6365h3XN=5veE|b$zR|7H z51d!_ZP%Qe+lomF$%(p=k`!*vRkYTLjfwdfNr_d>AMB$gcEo~ZW#0~glyXT4Gv!1r zQ-&0*(UEY1Bve9R`^=Lao^IhvO&Eq{ApWzQz?7G!ZvjigmAP`vXfPr++j6*8Yp6UX zDk+Md0qfwPD!vlOs)rLkmG6wx%jMHr@F#U_u_5o*Uo ze0>5Tm5FItdd(YlPDa;*26(*?FPR^KH$H&+Zu2y#$4g*Yh|^B^r^~{9u~h~eFT<3c zJMkwueLchi)VWaPr4VmBm)d!V7MbN5ctzpqV z`Ww*A6p1{}#Nm6OvVI@I$JL=~EYy34*rGVV(tG_nTblio*%rbjfW14v9f4rFv84a( zr6B3>HZ=uFKQM^zY}Uj|T{vGOL|z9X^&RXdSh0K98$#PeP5dvYYa=U!zIRH}hs9RB zcUGba`VBhnMQWU0a{&e<-)F5f<*HqJ&1p#UxKfD~IZ)Gkl48rS<@{omT zui51+3TuEx%lvYoH~XYu4h6lIWyJ|cV{_BS5ZA)2GjT$6<6P)NwBE`)(D1JlHztP6 zC3z~PUQtSC;Hw|(H#MXVJVu;4SZ!(Up;9{;!_US-w})>34e8A!R)J4;ggAoeeHno4i>M0!rXUNaI>#8CsT^laGQT*M_gJroR4IIP zD?jqkxI;4h10171F1l$BsOckm`3m}#+T3;lSQOa2D@4kofu_(L#OYb=z!c!Go~!sI z^&!n&5*RTREx$!$pv3rWhZ_Pu6K>g`+f7$|L^75oNESyQuWA9Q6V*Wo;z&F7TMoZDkHI3$lEV+D{Ns61 zCgxzV@YO)PXb%evdJLBidP5SK^vN%LRNBVZ7$s0}f@ z#r41*91-z7-TSZ4gt$v_;?mQA;+Q>Aq7g27-5jCujl+uWHB!!Z%&a!M)}&t$Yhk>3 z339`^Ky%PXoudKNy!sKBfF4SfM9HF4SJ?cg@MWQSD(|k?%8$y-r#}-(g!2GrQwj)s zL)>1rrTWTb(+0Ca4~li5a7QR!g+Y}v3!a0Y+Hd<_)Ux4L;+^df@2n{lkV5b5moY&! zM-67C4aY^zoHs1$s(+|0%%d>Z!IBF-!t0dq71hJx2i*TOb`)i~1F{UP@SBYA10Hc$ zaEPyaMYcnMYZk-?a5X!UPtgvT_0^+8`8wAy1yDVE_fp)?cM*cgFU{R<=OtcD> zPW&MalXaHF4mUY5Yc~1%h2VgY5fOitO7e z6%cLtgjUPJ5(2Q*@|2HZ@u@40dDCqp55F(DOwp{>T6?S5LUt+5;pnNc`&2$`n5 z_dG7XcLg9bxP?`Z)wzh=X^A%{%hAS{DR0`qUraw6*wF#G7(hVAIp8Zih0VEgI@MAr z?xD6#v{Y)C!+%$4WTNF#wEN#xs?v}Qi*s}CGe`ol-*zYz2&#EV-{4|9afptrFFf;K zjjRQK5!R`kKK9f$)`j759NW>+1xhI9oP)e>dPSTO3icZS`#%!@!PT26hW~-o57cMJ zM5&i6T7DH2p}`x5&lvMz#R7T{x1m=8V|j3xGJz*fiTrQD1CFy2r?9=P3C&)REO_7U ze-ay?C&7zk2jt+WQo;TYrj>FkQXE(X)BJI|wN|d&Mtp`foG2?1YqiM4dz#)LGr5B; zzAQ8LOE7O>l(fU1YY+K?s>gh}QKc~?l3TM4O{3SajB8=Q1A>O&E4MGP)tfYAn zLlPNbuEjjolD@$kCijXG-fBOMnR$E9~cCB!WFylgf;dZ?yd|wKY;XH90N4 z4b7DefhVD0qMDjmIW_Ty*$h)E2zxJQ!SDzmjY2WW*H_$e$3OAjgkz`sV1={Q(|RL;(!us5fn!h}6?}i#?WnoS?l@ z5Pvjq&=Z2m#pbX9m|!@E%<&GBogF5Z0h4CjN7JyM2dcL7IND;#M>$(y*`n=Ym%?8Q z&#VnOh(szmPxFh|7YAvrM)Q1O+z`Q2W8t?_8E{8Y{W{aa)kmQ_SqImI~2B>YifH(T8)STH@@V` z#)a0*1HowR0J9R=T=grHJH?31{EkMX(z*&Q>$v0|U>*FIjNXa1%}Ue_PflOPNBLMq zv|Comc&S2K#=StlHMJ||KqzFsgli1IHTWEHm+6~wkq=ug=J+1C=K$zIF$os9SW&+s zWwAd*vER=OD}ntkKK9(@xC6~%O?QWN=*-_xR}G31%d_uMy}yu=pGDpB)0)Q5)I>`M zel9JJGH#JFSgQ~qt}#q5GOU!8O0m}Ey?E1={V#>(9DP#axK#}Yne#D>$mivRt=lnI z;><`_%M!fvU(Z5-MHOiUCWWlEZ4;W9sH={(zQASxM(|FykcyYd*`=Xs88ZoOvw1n2 z4prPW9iZV`lD8Y6m=uT9xpL!0$$WIF5G@Ad3O!Or)D_VN+;>$w}iQpFbUnCD%<}@$oPw0l@P=*w%M%8{w zO0SuZAx4%m^Q{M|-;YK?{_Ei)(Sf)LaRw~}hIJPHlCJmggY_NXY=0#qRVu&IxYvp7 zPpOI%^;VFjf3e+==rS)pP}rknJZYs)O1{7+hu)m~QL<${Qks|ZZ>ZrYeHg+6kRE}_ zMa=Ak*Dz!@y+y8j6#bbnr4uHx7j%K435iu5OycD}iIxmoMHIUHERr{jbV3D7Lgr5p zLImhC9c%J9xF#Od87xi@Dim_a%zrD`bpGnWM8RiXb!?cn>6mlUe}nb*Mv zl@%h>yj-NFV!;~RPNJkD6;zVw;vu{TQ1x8gMLR`t%oR;k^0}AEdJ$xqjYrJo#vh{3 z8MG%)+ylo5*;TJiHrV8xzL6PzaQxQwZLwx(7TpE`=c$ISmSykhpy=5HuV4}NmngfK z^jxgs)K#kUthVI_V5?}iph|vHBxVEZf=z^Y!$D>>(nKXw>uYS?Z!=^ao8-Tq$3dJe zABT;#oCQ@^;Okl;(_T_VUi zc@@S9=@^FO05p3qE*ohQ_ zspB+6RVV&|vqk1%m}SBC9ui=@#c5@%6;aS9L&0`Zo5~W?yn$O|0S)__^?d{+Xqk~9 z7eMwid0@bw! zAtWcGONu$Z5>-8pV-j~C!Nj?dNG)6$4d((Y1Xa`#JEn=Ro8}qff?j~(OT8)kP+~}d zIH*$f^lXrhkn=WLRZGGWtImH{pwfW}>*{LnMJqR4APKfjKtzZNLy*xZ8>R!VvC7mA z-Z<TzEiwA+K)p8~bP> zGiwci;smo$omQ#=qY@(B+j%-fUZs66k#@x4ob&^(*|@3PA3wx|@g`C(U^}tJ6EY(S z5w%T>SXj{cE0Rr{I?v(C@b66Ko<=hcJH#iMl>l7~BZK3es9@rYP?oTMjE3al6H?@W z^7s&mHga7XQ(`#;QpgP6FKhs64BR^(bozX zicXQhK#49|Cm{%<@r8-wqU+}Dmz=f^>!}OTXY@4SGzg2L31?LIR4{0%e*~}_O#ofYC?4JLCU{{URcyL|gDf zfkZ~$@DZ|;uhr+O=3E(aU?ejKZ$lQO8}?G1>LU7!DM?jwAExAxh}kBv2x4X#y>*kW z^b%T42MU9(;8u%}V76*;blDT{NR(kDZ%xaIT*R5K&dAyihnh?ZG>OcyBk z7tw1_OwITC%V~mzszE}iup^F0az zIsloTUG?zml)Z(-Hh-aJiE)Ga+-YoDTxy%K8PgOX!m!Ya2g0A$&7%l)d(*R~hZ2TB z>7u?lit|x)6HesddwU+;zHyacV3g7it%+v@NhL5@ctvG~NyOJCrXxstt;VEfWny1D zw`f|H>E_p{3^kM{O+BL_XHY$|^%=hw4Q16VSzE|Q&n)4N%|Y8zY*?{LP=V&m*}=Ad z2+xdyij2ibo)9gK?>@mgv*^uH)5}$rz04wf3;G@QAi}tDhtHbkrZpjI_BG`V<@wRg z(>9jnPY~*%H{wU*eR%#b@4bk3mBjyhuLgMc4%`>eAXzgJOqBT${X+|CO4WafTL$H^ ztfa02|E(x*i6p2uv5zqk;(X7x*Ba^7s`)Q!ReH4|$@p3!xp9*!1lmVpEJHBi)&mPa|?>BpguGA-(gjXBPrIPDqAsZ zhCn4qi@i8G=85%*wndC`K$vbi1@z%aRRc3Lcf0^@6|+rXnh(;a17l9H1%|csTGG=qLVE|IUSF-{zyqg_553bm z@5@@PIwsoXy3E}bIJ-7i0+iRvglKLytj1^#{VO}D97i>H@!-eGY1Ytv;cj}m4jpRQ zBk{1(j*6CeKz_1VR6e*c6Z$ddF*7VWiBuG$~OSnaB- zg)`(LK-JaCuRo4ZYcKYfO|D@*c~)J+Dr0S4wU;LcYi+qM@4zFM#P@4t@wGF4OsG**O@GtA(rzJte)o!u7_G$uIgN1# zXvDZxjP-7ONZzq$8i@yV-FSJsi6ghTpUzS| z)GhKfDr#i=V=XccZLbi&Kt&nyqXQN5voUr+0J&RNZlAMy0)$DGNW!|7Ox1DoTW{Pj zyNcPO2|sC@95OfJ%fz7B`VZjxKuq_C#K(C<&;rLBkF5k;ATz<0ZuCtWT5}=HuXG_L7{KR{iQ#J!?5MS*2i;ib*6=6{aE-=G~9#4DPcl%eM6Cw z+8&6RuLMASj07#}n+9A719a9LsKX)P(kdPfBLbivm1>la7$`2KiV(^J7d(Thw_K_# z1Y@54zC~E*hD!75&C(59C@A_5<7NtO01?y2pYGwz(c6kdd(j}q%_C#5df1M08x9-hhE(y+W|aXlqSjB}ioXR16*aNTGR|riwqAPR5>>}ZEo6`A~O@}FImsR-vX!Fj#l47cYrQ!sq?Kr1|N13#1&!5Chz zP1_@UF+FGRnx=V$=KJID@L)!{9zJHSZn18ILkm`A4wWrpbl2jbqNtDgB427lVCb}kgWZbD78hvQa8RlOQ{lhTbtR53CrGBpbnLlSfKy*}> zhz2&tj1(!dlN(USel*1H2CzMA=FEZQfWO#)A^eGlaVjZTfwqcJD>2~)I{e!X(Hf`?DW2%sW z*voDf?hv>Ar3qfOM?8yA@5Q6Qtb{4+vI(2A4$eu*bX6dI57Bw`B~eHrtq68sb7Uh4dd-) z7*xqnkI!&(b)8uUKPk_y?PN~)u24WP!BEtIt-hU(Oyf+5v!R8qfXt<#w_(yxPbH>3 zeKIU`Tu`+*8GTxICOd=&sf657*lb42;sW1r2C}%B29$?7&t?J}D4ybK%YxPRSGRNuy0%PjPP>hJ%Lfdo3i(0&Q?M#67V--QeYr?zE5`E} zI5folyb=EXtQqBAaqu<1n1@4ujlqf1R_M3@QT%^MXsmKDst5ye3G1rUCD;_-6kc_tL?iyn3g5ZK6 zAa@~ijRWym5X7%#tZ79C7N71z>BS>?jlnj3u~`U#R)NPj!2*h;!Kuh;h@&xQ&J2QW zRIn-GHOY#Rx|Hy$LoUh89=Gy3S?e=ICms7N%X5#~HFU#8GjgdTSe~KCpoO$q$1x{7 zsuWAl`UMtAGV(XgrVQb8Uo8AnqN9D2l-M8aE>4r2x20IaZf0Vmx(u5Zs}J+6r=aS& z#tsVZ@km5c&RmUZo&=Ep*6z;picF;}J2~;z$$!E;iw4ICw98`JIBnG<|MU`a&H{C|3^c zQK%jRH1dqbIS698j^^4n6_%Ma3cM;=?SNQvIZ+L0k!PO3Y}wL)ME>jPQz_d9*!A#( zZW9h8hhPn{4J9#d5zd4=%!W6o_lDAg7X}?MdpLeA7ln$ArKtD_4uAj^M{Y9}dN$Ku z?Pu;+IWA-qmxSh)!Uo=y0b~!R#&3h3S|}2Sc0&PA!K|NhYUt;Qd5^>2m#SOk2gJE` z`a+2S);W(GOOP$}e4q&<_4n5Rla7sCFK)px~$?Uc(*V6O(&1EO%{nBqPoEYz&!%K}8=Ov7o zafHQ^1mUSM>qW5rX1Ej;G6ZQ!M@p!NQ7#Ink}z<88yc->dCW_$qxC>+PM3^3{EVqK zV=B?)gb51kn3jyxA>}enp^`?*IY>F1DWH$?Lx`~;eR3_?@yr2z5z;4J&tg7(5kdfc z5mTo0VKpZrM2}exsDYLKeJc?NJYcICN58o=90FeSYGS?q03wL-kO?dbqCp_#Qlrp`KYs()TR1Uv1;jq_!lhIe ziA6K`V=uLjQ}Z)nDcx$ScmMVYmFhW2}&nQbs=J647UH1e%3aX)4ICjD+ z?(fjOOu&zUvo94;yaAO$T7rhKbopUv{W^>=3vTSJAB>{;r zAN@nRNUh{b4E7ZSY5wpnQN4D3S`E1Efi8J2Sm_TkxDi!;IhvHPZS?a}LeV1_nQs#l zm`f*V7qsXG(&XJ`(p9Na2apF*hw!&55B{E zcc(pO8qA%DKAgTJIgM>+r(%iBx!eY{Z=Ra?oteyb-KwQx0hyrdyRXtUHWydZ%6V6e z9pL`Xr*t#GeI;o*N#pgavMWumMH5sq)~BaGLSn?gG+Z(wxDNvmL*)o$VDk2|mgs5( zr$qv-G-xXvd7O5+3eNF&at9ZGq+ces%s5;Yw~_b4nq9=g&&W}bsfktQ%dEwXS_bRl z6w+qP+w3=OWa8Y})ZH~C9J)KF?m!6TKQ0fl3${?f z^?jG$FZ5>!J`eHcc5R%)q0hX0B}coo!CrMC2HeUKzcS{KjZk6z@<9w(6%(NYAhMn) zRRR^eeI#IT#1xSf*7;kwZNlzyMHABuC*0y&>s+tNw#mr>rNz}{a;Xx1)eb1ayF=#dL7-GyTLXg$w~`YsoZ8^h7TS}7=&Ag-v}9@LFuTTz zrVzR2M?R7HBfOehUQEjt5!hKI7Go`gAr%I8>;MLf=~d*npQ`O=!HH1MzwieGRYNex zZjE4=*jzo;tFHahHscGds#ug25=_38gqxBq>liISf=Ga9=iBnFc1|KUm`mDyF&o1T9T<+uIf5 z_;eFYzFM<(Vx6Q$C3yg#H;P0?RH!htVgX|kQ44y3mYjyQ^PJ7BOGQN>T~?M}NPoFm zGt1>Pjy1b;WT}NpuW-W|&fm+PLgg5KihL&$!h^k;&$$ryzU_gnrcHByp_LkA=A%oz z(*gN!YwEyr0YDALr&!}ykPSRGfN(CI56U6p=DaqCYKfvcE%@j#@_+8F7M&Sp2GHRc zHfQ0%Q-gIFdReii6VtoFPlPYfdzxm~^n3_=4E3{uB-rQDf9a*$P(|*qb=#UUAfK`& ztdztVs{t^GxYea?RvnW}@_nKZWa)SOMj~?lk+m@HEeqgZ51DiB6PZy2Pi8YN4*S?3 zRt%8^)4Az{B|T38#c`TmcbG#rMJ+no_C876MV;hf9*(8PS~Klpuu5llcu;FKy>2YU zpiM(lz%uuaIM1GCDuJjivttJP6IHfW9e%qJLZq(|ykgvN14kRH>jc&zle~yVD#Ht# z)8RyPS##5}5x61ul4;BI2ndk*%?EVsqgv{KJ5dFaTG4Wlwwr3s&BVJbNbx*G@)(Pj z|3N{s<0SwIB27Ah2F|3+-WhL<2kNf4`AQB)maH{Dm35zg89XP z!qlz^cCv(4+D4TwnVSlM=W6%Niw(3io(?V@qk)wcZhl5cqt)Sq#%V?<(R}*9{i>!*dJcLF!hE4XbFe4uvfi zMPJzno2?cT&sj2_^>2S+@C`;lg2zGyCod8~4oMvLJ)a|=x*`;L==Vyc!ESq(j(qvs zJ%0Tcg7sKxq0O4eaF1SiPO`Y+nD)gpE#&vJagj2{gU@;n3=Zn$UmJ;SHh z%citM81!NI4~P^S_$`EB@bTwxpxBv#H_Aw$2HTsK3B(^?u!%aVAhyAqI}_8_Byj!^ z`VJee9sVpzzfh>>G|o$048!@++>{PA?v9_1{yDqwD2bDTdL9l2M1q$B|I%TbLX9+V|#HA zP&rP$CgW>lMt|d9;y^zjkaP&n=<4j$8x!lXSB=6rR<;NzIERRkYlO^Mi5k8}p(7EO zNWp(-_F;mHqR?}l(*cJ8xl?K(aD48-b3`cSxhJfDyi|-Q&h9oyURT1s5Mr#snd5!Y ziWTsQuA0{oJUof}<(`(_Rd8)TAGo?0gmP4cWMkhI^S?FT=5Lr;&1!Nm5LfHyA<0D@ z??F&om*DTErEe%owB(TKovM^8f|{4J0wRr*oEYqx!m`&FV>hKg*ChuLMV7@yg-dP( zKwYh#Y7F>A23)+c0VM<1Uf7zoF}>c!%>ER}%B>jg+Koejn1Zi0GZAXxUhSldn|lC} z|9W^gu7VyS2wG(5?5w*h<y9N0DA#Bo?#m+P4PQ4R;J(!MLF&z6%+v*cXL zyw_7Wh2%GgD(pdww1T^)t^v;8YNiIO8RPkvni=!wpC*~Uq7rSJdDGE`H`Zuw2ErIc z8U6isVr$Q!?8638C?{s6JYvqB;szvy&GS7u(~+i@x?Q{g;?lvxaAU0kHU;Qol*ggF zU`qdgIjC`%k|5rZJZa47K@CwlJgA|LZ*B#E7g-c=9)#u%oYs6MB4!X1n_U|6NCtws z=#L37P5eR262i0&Kn(S83wH%&&FpecklRHSh1<=+iWwplu(8=(!)efmIWvQ@A=V36 zR4IjIy&pfg5E}t{7=hAFcrn|@bVamyCtI)syQZH&7LCPE zqIC>kyf5b(JZd&PIm?*`?L2|TeTx<>dp#rCS*RCIG;seJ_3RywkAKB6480lH>&1LE zjs>v-;m(nH4=hTOp(asx2nL+2SI}NhmWGQ!l-UxH?MmFNfz%@M#etDfhPJ`L-0gv} z<}K$$ZHB$lbB&jeZD#7iy|q!ii6SO&;fzlr%r^n)|# z9FE-WF&mLllGMM-ltAWL9I6yH&mww@ezMWNCxlBqdKD(CiRa1giQ_!LwP@%@gdp0J zLi0lSkV7oFsGgms0IF&(R}n&FJ#SgdIC}(ubfOy-w?x90W!29 zqy9OHna*hj!yjro4fTuKGtplHM=7jO-USUwD;vFKTZMe8Omr=(QsixE9zluB1e zILuPiCQ_!{E>h7QvPgwLNS8dai?J*jT?W~AAztl3%&UcYmCD?%>580|1?yB1^aMWh zfE(MUVViP|p0muFa(vDMm>AH6K-1F%G`Ekjg$>n*LvDzdfiR*-P9_6!x8jleVeA0e zp5d(6+Yh&Lyd2{P5zqO9>6gSauS&XODp&$=b_FcJ?G57rAID*9tRQ4?gc+ak`#$z=eU_1x|B8hknp79>< zCj>R#5k>yrZ&mkmB$>GT?(hA)pT8f;^wV8kRb5qGeRnh2tXr;(ZII-PK?Kazf^41p zFe(M|L$mm|%sr$s26mkL<;^}MICmlxT^#eRBgDju%EYX$nK-!z_(CC7m5?{@DnxGe-Bk>Cv|3EOl zkHjY#|6nja7nd&ucCZgcMX8L{5bU8KSbt=9&ch5am}$e#gEl0VUD2B%2x9h?j(go= za)CthOKZtI97Hg%yltbIj>~)5JYEMDE{rZNi$H>vXr__lU%?#P3Z@ifQ$^W85^<+o zLa{RI;o{vvveNq+lY`G{|1%e#@T2Mt<6{QmGwFZk;j_m79D+~Srv=W(XPy5!9G@xw zvjBylkM$f_eyG=GRn3kcW_i`T%1Ut&rk(F?3dEsFMb$-x;48gwoUB0KkCmpwBa0kylF!|9!4Y0!!ojYtQB>MU$n ziP$oi)1`4p8(>d_z;d4ng8hp5-FR#+!Jys%wt*qA*9DBGoL&?H%L{?wbp&9$j$kk; zi!HhsYg>!kLXbG82T0a|w4P2dJ2z+L*V9zpx0yZO5Xv(_^4!Ec?39|41N(5Szro@X zqh82^XhV6nl02+aY3>5`rBx6D`yO4=cam}b9mV}U4w_iEc+VArcf<)szpz}(; zzk}au{Hm$O$EuCS$L1lv2Jvc@@v*S4CfwjnL$KSG%h%?4M&}uvtN~>FjS}K!C9<_} zpLF3bY2$EdjB<%dhH?AB5r>l;_t}sYwr>jB)c(FdrAzyJgUQzZ{4Fi%B@`p%B)_&< z`0|K9HhdrL7i;}Knu|Y$(LGbB6m1aTbwnc$;3^4uS6y*pkvlwcq+L3zYi171!i;QF z1vC70Z(y~6(CS_E^_LcmiALOA$*kbyA`#bnDG9^{q2p1Ota#)(_Vq*zdBj=vNP7C)gL;G{l&KgkyTdkNX1 z(^au$P*-<si5*os_2rf@;&yXqw0r5f@gm@8#4m8CuY&B}K>_XeCb}TM6g#6N#gO ziEw9bfbS8?cWOB?YL^(qFaU_9o);qUtB&e6Q&_bmA~lnfjcC6BFW=r9I9yc%ndt&l zk*i^~z|jo@$%!m-HH7>G?4CY)zk4l(G*B%~#x zQ&6Jf7xWbwaScjNy+awiLLQ8Q-h}S0zeOq9aZz9Rn0SF#kfMMnfvqq3)STP#j0it3H{$! z4Ju78N1kR{0=0O&s%3$QG;1xM$>h#!@g9dloK;H-V0?i}G=Q#q`^D{i!?X{L9HKS@)6X^F=jY|S~JGL1X(Sd#^c2;Vcdxdt)1+;nX1Wdo2i%Vve`=(b`fSk;b{kab&L+lHoOvWk9d0%RZJ{Ki6|6ex_Z0@RQ<@V&GMO{04 zRzSH1D*dKHd*5&Io8G-gtWHiaU>8tj?2oe2KO)7L(ee^T_0|N8iT<#SMJTs!&WY<2gCLoiIG-x1>WBB>$#g1>A&kLm@6CP{WSV?o7Hr{jp;^ausiBjZ>}!agFr+D& zuCJ1r4$P9%X5D#MHh}dQ=Us-N)DU&)V!vvYQbp7%rHY74H_s7?RZ10MONSn}n|rX> z9}OY>p$HXfUoq19TCWgLWY zTDJKXrC2v%oAx}-r{2r7;I?W1Gdpm;IhrL@HwhlMWcd@&_zk}!fccr|VnKybi|&M9 zA!2OM9Y>S55}>9+eG^e5$7^I7a?KRVgdx%+dLzJ| zA}f&q^BbRC9 zpIhMzYuZ`iYjkUzr=-n=t?DfxaVQFs}mcB}`>~8x}CO0_e9WgkPw|p9dw<1`m!3z+ap~1@$T&Th6 z2&ObR2|-tb2O*gIykPhr1cz(z1O$sT*bl)<4IYhPErSW?m%~Y)^@U%}_*z+zgNZ2T zBT2CDXgjY-O0OOeiPVqgYa|C2?C^^^;W| z@1pdW4}&}&H}ZH5zXF_a@(Zc{f`Q2fkw-WAjO0k^oFB%EH4KITTm%7U6V7dtC}_|8Y)~Y> zQJA_y5g4W}Py|@!8gQl}*w#mItU<8S`3soA+r`fD_%%6)5j^fpKnxO&z)xRR(FSM3 zr-LFzN-Kvj4K~NR!$bh2^(}&6ww87gAH$~SLrLt_W2LjTp|vG`DIp}L2p)I(DXmTM z(_d-b4qDYp>pH@Cw5}9%Iiz(76B5oipVsM;NLn9#q~&@azXO%lID*HWw-AHEypEr3 zl-7Zul~P(K5yqo+grE~zhcF@GG*R(duDv9YwEkge-HqQorIkzYxO1!0x|s<|>y1wa zMOr~?rE`bLMVKL)Yko{}-Ke>$@w1!e`X_Sby~tcdMST$_-;_&ua;h}fwfNavb6tvD z6D1c>F&ANmYpy9u>l)297eB)^*Wt)jhFmD^7{Ykc7=|x6JxYEzCM29yVkx5KEhUlC zIKj|57QY2bYuz|0*O5xA5I>`o)(an~)va{yLWn--S^P#=K@-lC%!N7^QPq^nr)B>_ ze1RF(xoHY#>)a$sk;?HU>?xx~xkhty69BUOO>^V8kaIye_f(U6rL*=!m02@>`5$1% z5H{|7h8VD#!H=mK6}0G8)X$eD7hw#sKAP)8&GjCBjE$d&Tm_PgsHh*pm|FPuSfTZf z=6Vx9##(nnt{IYxsF;f|^yJ_$skv5bu2=D6?Cv)RJt?_}in$15YT-GW>m|+Ah#zBj zuOL@iauF4C5vIS=8m75k&|J&$W9*LgAo3EWK~&5|7*h-X7$fCcs=1!SkFmRpkSkwu z5fyV0W?QAzsJWijT#NBzENCop6-h3lVlKkuX|DO2>j}+Oi=T07ckACD6zK(+mCoA; z(e8f0ZxVPQ!~V<#yQ`(;*p5oV*^9-M9@k)mu=s1%ev2@|=Tcx@(I2z!4|6} z*~zGO`ysaNBlY6zLs;=+DR9{|oKcwS0kfWgf8^ z67mL#T`h|Kck_}D!9FP*Q?hoZaG{p))6r7G6bo%!WY83zXRVIcZIsN(4}q()r4BOo&%&8NsP zBbM%IGVvFgFbH&BAB6&oQ8Xe1g8q()BHOxLt)jc1pk{rrlh&n@$>2fk#TQYEdtEWt zRl_Cs$kIIgaW6op6PR2G#|M1_kEKj{)M8zR1i8TvS}lv3>QfV9B6P zX6gqKZ+AnAG443T_(@;M7yJmS8E!oWx;_G2TH_vrsb)qOCY%)`tu&sIP{5c9APvlD z=>*$9R3ZxqWU5OYqpTCr>N1nbz9jzR3AUeilj*EKn_!E2Ogjkq_1ezGe5%a42X)Ep zi%bqM`@cOG^H<^*Lz{|F=XLZ)<@8|XGzE4#tD`$8rx|FJRvhFy9i>wJQlw?w4o1nR zP)*IN^{V5^=r7P=AORIldLboSA-6)CU)Gc63R({$dp-Io zepNpzH`h{^dOv(wvD9M0XYfibW;>hal?bq0Q;S!wGqrdaYjMKK8({^x1wx@3I}tXD zB?H|HnA2CQJ|B@^cUx9tL^&G{n~HecP_aJOHZFv;co^j4~a z^wyop{0sC8JC(UWBR79V=64#Ib21nH1I_}Sv!{P09US`zc-8rWvYq@(CDP<7_j5%T zXVZny0R#N?b)nO=Ru=~eqF8J5wyKMp4z#+s7NL+Xis(I21@DDO>b6#0oJH{L9`rCK zg992ier@xb+Cd}$Pu1`i60-Em^9+!>{yAKlr-!v32@daBZM!lCed;-FyJQ30?2`eh z5bUCAUnI4o;1tQCO*iH~7(IRLiEV{Jx1q%Mni<+uy|z83W1g!9k!iWJFyWkkfECl3 z5(;z%Wu^BtDPiktt0_TPHIDvJeM&7 z;Y+f17Y{4ju5RugScnGJCXm1pH=uD3V>Q=%$(!6t+L`PQ2O~fimhF?O+)PV?X>!KB zymVpYZ-?-cJE@UX^hHX`UKdJfP)gVDMM@tC@)AJc)c^KMDGg>2;XFUgYU*hTSxw0W zx&@V`9A?!NsG4peM0PdJVzRF$>pe1HL4?LzDVD-!B5td)NMo(dM=Y%B4)%jE3PMzq z$zZER?c+2wR1X2Q6fwT_M48^O?HTeZapX&!Mjd2y9C#iv z#v4>2NAu_%J&jv=!a(-EYxfh;THq@LSXiuGL>4GuK;RWGTpI?;>E^T5OI)y@73wqz zp;`tmH7#G8k2>I@4zRRp&1N^+5Dd0a&5#z@Ri+d3UIQA;+zRRx1&$y&Zp*a@2dl%M zY-Kx-@a&MWL-QwF*(L@Xnq$=*D)$w0NTCp&wc3AWvhR(woY3L{6srB@=qjbwfO-28 z_!!)mCNeD`nA+$L#3Vh50TQw{id`Z_9$&nOjk`sZx3&9p$=fST?#P>p6TFR39=-2_ z_|5H~yfh2l{wrs)1S2I@yk!k~1{XVS+tmWsDsNNqQeg2Zb#B!rQW!l$fLnfTX8X%N z3Ch}XAX7#OTC_m4cehTjL~Cun!u076R^HO)7jBoX!&#Sah14n`Dq<{ht(*gve4r7$rBM3#0#3l9D|2+qB4U%KLB(pY~Ed-`zildtbwIE(@ z7nCmDsGXt}-TbVDk`+D|zY+Ibp5$R2592vh@K~V3LO{}e!C zE}y-b22PJ&_cGzO2b{^CDl2cB9ld4|qc=vh5zvuZ%1r%EEM-R98pvIwca#-@*wge@ z@l{RDGFXJU1vGOsA;VF}*v$BixOaidC$ zG58P*QB-(Q0VvTiF?3q~4t7!jc1~1w3|N$9i9e5$HmRrDRPtdS)i|2>-08200P4Vs zNH3wjhbN9k=^!U%I5xrTa@u(hqs4SmAwPYX*t`_KbhR4zYvhsmgFum`nugQ#Xb;W zcj`lk;7}kj;O@QXsyR!CUWO=u5E9c+kXtM*SZQtjwFtPUUPjacbV^A4NfAFxcLgPh zPFjHYWQ8B<`c@#9KNg`Uyc200q8F}#HwbB;N?B5~ovYE3w#1(V`cgoC(9pLuv z1a8F4At*ce3EJx{&<)3pnp!d_RD{wR)%VRUQZH(ncacgQO9mt{MI~V%CpY^hiv&nl zvIb3d(aWNyg&j^ZcDl-_23VS!x8Vp;to|>Zf|thbr|-P`^N_ zS9YLY8K7RN)OQE<=31&sNlg=mh7|Lt zD&{c)Wmn96CTCYndj(}g<{V|&l~4FF+zuFXyR}e&8N^c--E&QR2Js^O_5v<)d;#n7 zsxQNFk_Nd^Xx=JsBnZonQqNTtJogc$%^f6 z31t&ogNp4k0%aH5sZ8!Dwp4}K$>{S2+ok9}_d&@z9o1fzsSDLoRi@scB9@w=@t%EO z#P385@_{*}WDx~rg=FfPvXrA5w|5C(8e*x76}E;(D&vlSks~BrA_;U5x&k3nzgzx| zm^D%?*jvF-Vy&S>4jW`Cr`0Uw=!&*tw*KUu&&9%`mdM^oO46R(2}-n<{LJfFVI#tHB&gV$=yC>U6Z}f@N~=F^Irfja3n-z z-`&zVmp@*T6i5pDomVX92iM+VqN!Y6dq)x?|7`7j{U_)&;~*2O`1&2Kt^OdP4z>!v z`>xvQ>jcPdr%y1sqn%n)OkJ_Huv197V_~F)!s8y6$Es5$dJ!kkb1c-9O z379Prqwt> zvg)qq|HVPfoi9pmx3OU}P|HD)Z)jjE&A$!2_u*4Ai)9i@nLx--|m~n^`KMfXx(O;`3!#L6fUC za~A>3vY(ls&XAo#UG|&JWV38y8qUlDPzJXzk1CkCi~OE)>Gpuh+-%}`1|bh9+$Puw ziqsNi>Ozx>2w3&59*5f@MCY!Pfc9}So`0?}EdI8=u$V+tT_;oMA21nu21Wi_^R2yI z1jHlx!`)MG_LoM1^o)VC9<}xkA5Oa&{XP;=bF$UUAecGuz_;mUq{Xk!o2#VlOnDll zGRR$fr=S)SgJGL4#-s3&FfS;MyqU<`B=R(xh$MJjh#0&;c;>dg2lLw@da>F?T76f- zd38HT16bqE3JIaiq4`-)|Gygj6RHdSGr67qlSY%Hij4j*Q~m$l#C!U0{2-wJdrYd) zzsKfw2xZZ~Vez+Zg~cTJ=v4nq?nM9hiSUj7pUtlS`+Yd0f3OXa{4eOgMo_ocKN@PQ zW?%mj`G2DS4~1D@|Jy(ss(%T!*ME`p*CEN?o63^vU4+WsX3S=?Z}+XH@}wS8p~>!s zXg%Ii!LbU_tR1=DhjZLg4Wu8a3q{?ZRxL#9OW*_0L~hT9#GWcDq9yB`Jz7b}@e1ESf^$2!Y?Z2Rn9 zZ9L+AysIdqz&7_*oOlBlZ7oF>vuBC9f`HA4ZM&z+*0IzRoss+Wf_B_m3I`erWYl;p zvzog6J&|9g`F-u+Y`YcJ3wE5%B;?QTm#>`#YsJtQ@8jXEkbP9!YX^$9F*=XcnC2iU zDy`xe-g$+|@V!RMR*%W2RgaZIs?(MrDGQx`-#hsnJ?)&*rVYR~`$QmB2wls}@SE#7 z&|U_;VVS|eoMDgC%4pl_O5PS*;VG7+5rP@WEm0$CYPlO}wv}l#JSU$Ov=+&ncSK-~ zfJ}K1WG(P5tR`Y9v`3Azi%Cxk!x(k$1}AQHNbuGG)9egBU(_d&+T^q=2rmOiMg8M# zvJfnXnUMUcNq9@OTveEGj@uHV7flv2RK8+X;68v#us}Z%;liNqQ2~2y2Bzm1I!(Cbt_4KN7nc zubahaZywv%#!3OVUA5J3sZ0P_XE`&b<$W7{)d6oRI`0L_#@AULIHb0d4T2YU^#^r! z;kneAD5lXZ5!=A*8jrslr5-H+nk%|^GPmm(=B;dk_M7zc-jCC4}IS4Bf8J+RkB*Oh^bgLAYFG?KJJYU z=xdTxrAf*}LRm6^FLJp=*M~Q3Zj1JlgsgMK`tS^yb&F40h#vjJz*}dE@iGCkw}$^> zvhQ=W7=E!_mICQ1mt10^!E5){y)ImJZ1?0g5FOGRv({}mB}8M~PzD@Ho7XI8r8NU; zW3hKk7h0`obCR%!?zsoW9+su#lz;<`W&;W~TEmDq+^C%YrZAUjnZvX-B;xzo4 zv%;*AP(YXy;hO5O!|6$6YrI75p`1Wwr?qKl)KlwD>uF3j;|Vh~O3T%f5N>{V43X+f zpG3{8lf9zuc$zR}!07sgefwF z8d$4LeXNGok*P|e5l?<4LII}ctev4XsfLCfUzC)e1q=BD6RcFp9j;8)QkX_^DX}X( zyRo}6X`8*yO|WVSXSxG5YsK&DNh9?$ilg1OGaiGQSx*rA3kzAbhz*GL>r6 z^0!*c{#CzI>m*B+W}!tcl0uo><9-!|(cDwN5waY2B>ru(_lf8Tv-JxbB-m~9Dj0C^ znnqTZ%1NSPqxIvXU7F@FCi~-WtMzmbks|j%4tF2_mnn$vkkUPw9{6@Vc+P5Kn|h;q ztn@~bAg%?-jB7b`8gjGF;YmK@TAnP~8~B3Y(2fD$Ou#1)oErjbxgoISNP^>mMj#UG zKKN&6dXYZKS0z$#01t0lIe~3(tgZ5doLr*H5ma^`=Ht{cCA_P)W_>obmeE~8)=M2a z>Ch86J#vza;JD%f-w$+kcW9-1v#*FhTcumXWDqyCpvl$-b4CN$q*s*673RcP7rI*r zZw=bg_mU4b+BKAyh%8!lze+!)CpY|QTPxAj85EJhxAIk%)!=(tKEn8Lo@$l|gWuO(YaJm0mguwR;VD<32?;`?lqov|w2&H$;}#=Iou5$>5uoI zQs6+0(x2crAB2ilVkk@wQU-*x_2L7!7o;-L8?gT(;^D$NUI1Iht$lB}T$Nc~{%N!> z!$X4B44xK93~4kroTWSyO z3iMKMtCnRFvK0t*Cl4BN&F(~%sV+rj! z*x1&bYb1osbZVYM%gb7Q{ufR^)~Rv%N8T{N!FGDg1iYcu=ZB4?`hed~=Yij3GKvMc z^VhmeYa+FWvbg^GK*qq;j$wS2ETSxQM{AEb1Hjs`Dj&$8Z9}wTfugN7&(K*{T5C3U zTKuRXcH%BxvaudNAp`ZT-Uhg>1I3` zBOId~VmX!yt)@0$FB3JpwUd+)%fEV9v6NwX2kf~JONurobJWs88HI|2q(XQ6hd^em zLNjinQ4|UYY?{1MK2Wb!p=gLip{^?QsN<12;q+x`>EWFo60)rqH#_Ih`^A?G6jvZO zi1mxgEPfN1#rEbrO&E?J9d^n6aw4}Xb5Wtga$)mN0brO=C#h&oY@i8=`A9s0Vv)#5 zr1cP#zsW+R4aB7O5J<3lJiThDnH1$o$Y7D6h6$OIi6ntXH_UBmD7iE>@sk)IL;M03 zSGw+__TYkVAe-Ivc;O21sHv7SIzx4EXQ=inIl!PgHCT+LD5x#pWMR$H*u>B$PLJ7e+o&T?Jg=ZemqNqSoLDIvZtd7foQFIq39wDLP#Fk0r1 z4go1shYEVxzQ;F7E$HA7sMmk{^)D=!1^R>U_;^GW-|0TS=-eUFPK&ChT6Xap!LEp4 zP7nQU7QF!79Rdo<@awYDuOo(C0WA)JdiahA;X5V-r1(_2g0HyLNVdqbivDH9-71vJ zL;WoruSi0Geq0tTkD#8LD&f;AtVDv)51t)8F@=9GejlB(jF(Smns@K(sr7UchntoP zsd8lPmg=++%go}?&eh-^Am)C?McfJv)x4;NclTUNR@(z(Gu*jcW> z`njTWXNx$5^qE#I>_oa(rGgUo)N+zwv<7-w2qL-w;sH zf&^c5?moW3PqXaeH{!mrv{QB;5N{851?Z6wkfJ|Kq_L)~bd60ADOx5)R= zla1x)<7k7)a5g!>^gej9QO5Fz{BAA(H*U;~$C9x8k*E%^{G@J~&0_gC-zM-2t>rIt zBdn>O9*kCo0dZ2Mc8{ z-c#Y;SyZSi`J%E*NDnH+tw-`*oTYH7V*)Cy#5g#p!rZP@7=JpTLP7>rSORjijA~lO zK0s@0mX(Ke7`z610?Z+x<4dzJyE&NcOvfo-$C}mZ_@`&u>3Ej%6@$f2iGevZaz;Rx zktW|1jaJ<4*M!R%+YqblSoimAvvq&NEWpUk$O8`fP3nGSmv#TPn+3ki*8MWKCr#X| z`(^HrG>-(XrD_j=BInChgyeqt4XQ=$H@Kr=*E7wx6W(Nc1AsUe|-*Y9= zt3)2(E03a#ym(W&WJ4CZ@l3X)Tn~ZhH8%yqIv}0=^8kLqPU62+tG1zG-azD5>6boX)E}NmN zvj}1d+miN$Mnmzf@Yg{Y*SzBk{5h810b)_Cs(Fws^np;u%_tb_m+I>wU)z4*qK z?F@o>e)1GQ*(Bb8#DD>LHEi199ThP*6`dQXO_H@ij&B-avgoFJ_2T!oHr>Jfr}j?s z0q_1KwP_+CyL7bs+#tCM0cUFy!|npwkyo1}>MDuS6OUS(6uZGX8?ems$DPk5gvfXWpKgF`sZJPH^_8ITk}()_+l zkjjQIOl{fqPd0st)6%duNEAV78*YFG z@UtMxEi*hK6}zdt^rl^-b6)~a49(sFe^Du;K#b51R}RJBLD9KyA-#E>0!=QSiO9*( z>(<~q0SxA5g!l1D{7bZ0t@V=;;l7GP_=l-STsw8I zbb&ZWUxGM9d^ zlZ8xK$g>H_%gR#A0cm!Jx4J({>!Kz5Konqi#LiZ`a+~ousfhe}p}@WVT1H+WDnik< zlvcL~NE9ZV+O^gI?~{;Sln6|&>oY)$*asz%BN-;Xsfp$aj9oM_-OMBd@irl3F9Z)H>I5-g%S*EnM+7R^*Of7I z?EN|D)oe{^blrzY%It1==>dLlUS8E;8ra7Ukql|nyhit_V20bg3?a#uX@(}raCI=l zU%d<}^59P2(}I8n9w0HRE}j=%=(+wwOv&E~39h%~k|7|a(-aci*EJ&5bTi-CG}+&? zf-4yuj8VBuqV5LHG*8+DLeTj4H4~mxwwWX*kZ88sH|P18J~EWLMJvpWJ1OXa&aqB^ zMb#gNI3B4S*8!+D0A%*3vg3s2Me>G$G*2&x9D$v|qe zq>di{B^_}|+HIQ-((zalU<(6aYXr<}Tdx*Ere0lgpOkzdGE{2@Z}NyjXwi%{s4i)D zyug}_2WiGiWGo9%5~U&v4YHMuF@Q1{K;>*+ghIqd`DI|X+C(X>N!4gwliGv6*m2V% zfkz$&o{+@!Qg;c*d#*NljFQS!NsCpDWi1xvS{0t4!}Yk1J4eu!uslufrT=8vO?l3d z4>%YQ=k!%*%47yO4ixfhL2EZm@ z2a^3clt7-4gNyb7HT)tl=58Tq8127Y&~(uV3T6>YDlI~>wSsVad_+622_Y~M*+H?j zXjyR|1$>Y2fX(+fs1Ac2wcOoKOGBniY1)LLC4^MlT_;-5tXf5WRS@!~Anz!MFsmTz zvJ~sK;Vf1MJ`_#0qM;rQGrtKMy_Cv47^(Pw*975vq@l7#hHc-kn) zlda5#rdOZ;kjw$Gd?q#_C25&rNJrRvZIHM?o$98slukhL-KD2%<{EX@O8M^*N(cy} zrzF^emuHf`n(-CG4gHM-LZ6YRUpypWw}bx7KYAyj#S@h~^vGJdtlD zM6lC8*vU9oC~&-MeRj{~=$K>*@&5aV>{+2tptU@s76$xI3U_OHhryN25nWGYX;bkE_9XsG0CM2AD_!A$Ki{MF; z*b8lq6JxCRIMRWVkb{dp2JFd%gub7pxwiImZ5+z=>-!$9ZxBSTOF!~xeISXTWec8g z9uU-&(cK97Z_pHA{)yA7O+#{JTiqPO8Nm!^lpV<^4W(L1#(1T%YzfWu6HuJ?)P+byb3)w7@fiF=%40VHVvbCCG}}6k&HuG*OrjUQ&hTu}gU#v$S!;YH)D1&;?fK3WU5Jz)Bqwx=1Nc?V55y zfU>Gl;m`8E@L_ZbLHzG#g^SgO(5-t3-bnqT6gP$~@8|dMHAP z*zX-_HY&{>yQbMaKodIk>KE21C|y)1%%MzBqHj0ZlD;gVK#iGbYxR3d^&tXeFX?qm zHWpOJa>ir7<2!R?u&7rm)gq7TUl2l3Yu)2%iJU(dX-om7a8k9^y@ICj>(N!WA}dI)*d9ZE)+Exx0Yr>3#;G@;!c9e z*3#-fG=PmfnRg+mxiSDH4f1#aB24zis-~?xb2|sDne%3F`D;6si>?>)K+@ z_?j4=aKt&pS7rl=_(^9YuWY}+%~H10XB~^PnHJ}L0%R}Fb4>P&<8gc{cv+f63+Qfr zsgP|YKb%w7aumQ3gZDIM^|`&iJ82=aO-{F65fQAo@ycZ z-i3iELR`yG!1ONR6@Tf|`7O|AAcRS8R@_#1!)3}#^QG*GB%D9qV(C#n=SK}h8PWb0|k zy`K}mm?16QUSq?lai(HQRdfWsaLY3HDvQ&|ln^Ig(T!Zmt4cC(C)NN^K8yh@6*FgE zI)v$boYy31XGzVpY8ZNvr6}wwcm6UtA)Y~XHuz?N<&rjc5F-p?HIe&YxAMDFLIL^Z zWi^xk?n$qv-GnP^A^N0ONKqH7qBbE%*%h^Rbx2VeI1CCC`|7TLh(QSSa!&xP()hom z&fT8=M6M%*+-41TPZvj{!j4ZI&TLos*$S+<#3>j({Im;8FrltVhr1dVQ$+dHLt zDE07(9_rlN#40RJ=*HQBg%S5Q03olcg1mObuU3(?rMnc#yG-_NH&X_}OYtw_9)h}K zOI@BCj)@KzZ6`=N|70Gad^m63pBPYN9T>kqefft|y!mJ!%sW>PRWNne;sKyQb7HK*LR}Lrrsu3*BY8enARa+m@H|w|lN}n1i|=P!2$O)^Ko80}g84fA+T=pkFaER#UtaLGJ|U z(iA)PJAWg+5XcOdZCnhx?pIr}AWqFHE4jN6^7L0=E5=OaaSp+)#mxPToN|^2DQ=^Nk**&}w{gAjhf+Ip4X2)T#JcSrNk&3b z36y>8RlsDB2ce*(T=SjgF1G06Npeq8VHJAk4a?9?+2HogmHMs6nyFI)LW{0@oOUds zQs=WqAeXBDu7tdyQM=btuTy0{NucbkE?~0HYI>+pQb5)5j49r zkNbDn%n7lX)1J+X-S*NPrfmMS!m`3<^4m%eJxW))k* zgmW~Ji!{d})FqpP37VbFo=k4|6E^=unmcu1^Glr=zW;g4=A8%`HvOio=~nfbWdzIK z0G`g|2ItG=gCa$`9CQzYl^QHVuvUYwAlRhA#}SOYI*r->2f-m4yaK_A8ax@nSsJ_m z!K4PyMX*tWc?h;@@H7Mmz9z`_MX-RugmWr_SWy}dL&Mhud|@4`57u7BFd^aGC~}u| zsC-H6)dSpgI}_|Gf=`zT0?HQPZ{iCG@Mw?oq9hccagvm0B&Ao6mCidwgCaP~>AZ_-SXiDgG!Dn+EFX)6&p(J>OMo0fj$g6?rnV() z+*zQ6=HurPC3FY~<)%d>69u0oG)B+~p#vqsBQ!)(Na!p>=nVW0R6?5&HttMTLMP+r zNhS2r>5#n=dMCx=T0$@4%ZRRC5S)`)d4ZnFxXg*=%&S1nqUU~RQDWOsj znxTY-62>Exhc82DfFyW?Hj)$)`eCXPYQ^smCDgoB2(3X32z`a0mzB`AAe2->Ul7J4 z^bWoZp_e7WBeXU6#)-qN;BZZ1`e|&)x+V$>CNH}NmM^{P*N+Q=hovn&c;S}E>0(eE~ zFEBYIeocM)5Q!+tVTb|tvH1B|i&BSRJ_xOJ4o8T! zfiMNi?N`)F+$lf|5=P_abItW0i!B0pf*~ZP@msA7A4^&gKw4FCj(l3`JZ^XfKbFyzCLATHnw9HLeR%x_tk+>B&O8p}UCM@~^IT-dz>AAb zvUu3)7Cf}xUun)qaubr%c72oEWAWw*Md0pxmSrE^f7k(bW8U*1ral%HnlU-3mY4n> znRNpG_AWjefBWKYG{RkO;amvJRk+^8dxD9kMCtGDbq}oH(6T)^R$-B(`)g5xdVua<#)${Ee~%1gjZZbDeu8H>ZIs< zK&D|p3<7^FEB!H2oLip<76|WFW8BuVX?=nHF2i>?7mx6@a&=M(d_)4+PZn`k1+^fY zkO1z_{ZSYV(a-lxAdb5xeS>TztDfO2ton(t)B;@hU5+Qq zW3Am;yv)o`Qlf3vYfS9~zi zGwx+4Nje0JbQW2+a=31kb&MxV639Fv)>OQy&WrDQip>D*57Gh;(S%J+Ld)LRo2Mri zU@lG+)ez)Lwo)kfWRtx?N~U}|7e50a@j}xj6c~`_QEg^QPgTWYoqm6)1~ow4u6qSV zho{gs$O#1;S7^5xM5<_Ed_t;n(#r;;s0M&9qdF#fz7XjTn-mG40@EwR{|S_Fo;JfB zzH*!dbCz;&3&?U2n~Gd{K17r%JQKc((i$!r(W<`*a-)86y{h;;UoE4bM}d+{8K}x!B7W<=r1)c~ z=pw;*$>)`mGAuRHGU3uDNuqZpPNb>I11mv=p6<#SA z;a!3br65!Z;}g4o*$I>@Plm4!V@Xs(ba6kQ2(g#!LdEMxw2EVlYm73!$doWSqF zHo)*!1hM~zy!{(kaV(=F)_+sxw{<4-JWuB4!4&lw2mixVA(@ei6vsS|l^A`_Q`SJ2 z>~HF8VnD2J5GpBLgxCl6JQU>qt_Ip#KVW+p=nD86&vBDu-_5c$oA7t3OOPLNK&7k~ zeeO*pfX=$-{g&g>rk>2=;DG#7AEb994r*69e{<>ra-OP zkDReRrujCx2YJ>ayGxqfC+N?E6mn5Gm?Rpn2QcTlRNA6HlI!g?*Cu)N<-3q|w3v&2 z2{ma6XU-y|;F!jEl-}6>=m}ow3x`<~7*I<D%g$q0o=PE>Bzlj(#2? z(Sm5FD0Pp=O%a%_LGL8#D;S4sXwz2m{%;1x$Hq{9`K+Wm0GUtS6i=GC8vvl&J0$K% zEbBsQK$gICbG#8vX3xTSb!7juz_ynHf!LHBrtqalc~?<$(%xHfl0}}e+^j>wSAdd- z0ituwWPXypE0KDxv^rcEPC`WW`E=m2-xZfIv&Bw`v(8}ows5z1+&ia=VBx0es`D-6 zOVTJ=BqkP$YjRf*z2d9KY*NHchCu6!0`wLV7BkKO<8Pz<%JFj)R^436#5LkOC7wK5 zDOWSw;xVl!LxI1I__kvKw(;<>Uesq4AJg5KRx;GnRlf&#$QKWWUcGyGF2QIrI3CZ{*o2c(#@HEmo@BT@1@mV= zq{)44CxSb7GTN(do_S_xvaAz~$Jna?%H7r61rH zs%@b=cNlU&q2CfM`bl%Y0UGf4G07tsaYv9Y=J5!S7%lP6BqJ$`xf(Xdw2-#|ah*=z_d1f=BK=WL}Jclw5H*X+M&yqbrXEH&y zA*-8do+BAirg;uwp1#P_a*C9V8TMd$9y5F*4T`fhBT|}SQ)c)8h@@Uem=Y!EVg>yc zWvq`3lrnsVu=^NkCY*N=7S-jTZ?n?5{~=6Zxz}uBdqb_a*r9*@C*@-zOT_~mdE5F8 z`U$v*JIedyM5eo!_bIK^_TDG@cM&)0eM;U4K0Sj`Pwn@lHlZ#DGS?qCu^<+g7%&tZ zioLNPiC*4!T3w8{VOchJZz~k=*7`gtFm}~GPbug_sjVWC`U0C&BT4A_gic^!0%RuZ z!Bf8mEZVCFP{!5umbue?=HirQxSMyC?dIJ~bkl?A@(SsZ{PMO?M^fHReUuwL7(|I; zvWT0xPmR|idWHJrSPUMEY@y!37Z~YSsC&u9r@?CK`Ncw=P%)$Pn0D1<2e9cj(x3Ag zX+N$vXuzkU*GEU}y8CHc=WlV;BI=e~@gODxnr*m@k+DqiG%s|Dj3i2e1DL;~@G6nt zhuHEC*i$9as(oo0z&x%(ZmoZr#p}VtQ^d~}7k;Yc4r5}b0SHe+XaNAv8KX?eMo8_( zI;7vl+emj-q9ZMvNwlJEZF!%dp)q>UK=y*6D(?l#JNOw;_drmaG7k7cd2g$4Bk$wG zLk!)~i+B;fh~0f zfNz|lRHrl1F5N3t9Wd$%n!}mgV20m5)$}l>D!=ZYO10J9LIbRPY{ps(cS{>?x(N^D z=9hcOSAZLl!3^c*Jtk(C!Lv;6LQ zF!Q&H$`S<_H;M&K@TiZKkf$@VRr&*^zKc?)FLsAB%92vM-B_us$MLCWo)hY!tuuX}T>wQj0<@_|9@{eKx1?~LO;jH+xfAn#Nx5!xEBhGJ zM$uljtd{ge9{F_h%ogrfB!kQfx9Rxg*z07pe;Fx=LCuhmCt>ioneupI*E|jn^O$)} zNI4^@uh_C=9dtz^V5Fn_c)i)`ZRDfMzr zX*o}b0-T$eSxR{=LP{D>i@uCZP5UePi@GL%Ts!h_D*2Hf;(a{CM0%tm-L`9_>+cGe z>3t$?aE^m`B9Q{x$NPj3##bZc%WS&he~!u7z2lwj@P7of4bBf>3Z2;v4bImHAut<+ zF7^mb_X)K-k$tri9p5$4A?=8Elc6Uj6BCj0%*J@1re`spCy8Y^PKAGAd|`P86JN^< z%U5Au5iuD50HB8e;Mfh1!fvkee(6ptk7Wq8^MB?fsM!pVBxrVrFo(&Y0=)c9{~!c7 ziOJbB{&G<;I#0|Q=|2Y3<7wUtS=AqXa7<*nhZJ^87p|5fFsGh|@Vx3zUQRgDs!=cC zGvdC6NmX#C9@hApp9x4`BNaH!Pj@OtRb=lMrWv;6qEXHkg2@>iDz>?oB&0=2lc*+O z%Hk^A#K^qAN~D~30gq!S-1K@6a3U~haf!DZ@zxf`d8I)54-W_12+#Oa8 z2O;FCp+LNwIhAmeTFX`h&2FOWZWlG!#vrqiS_OP0Xp3et8%q>@7foYK4mitrQ_@zR zcVM0jWYEvC8_roS=XRo(`f~$9?HENpO)8Vc1k29kq;^d56@;acJg8^qj${XtKi+`} zeo>5qoDEq2U|g;j=M}A=7v*hGYQD{K{4qiv$6gEngmS!`VA-wv9wz(N?b%{~B?!aO z@grc;0~jYOzz5^gY9hUbfn zOJMiF*KDx>xQ&g(J|PRpSxYf8qkQmAOa8a zu+D%-!c5O_$cbz`V5<(F{SzGt?q@#2O%}>$aox_cqZ&)*`CWbd6JD{rYBFpf5KaVr14tg`TUuE!sR4g?tD-7JWENa)d zFKOphpF=OlJDV-nFzfzaR=AV9*p4ESGv%;INCQ>$X(2 z6cbc#$?Q}ulbDQpW<+4+>ROSE@Hm3)4UQ#&$|X|=G2RzxYNQ7zf^o$tjbM!IMiHdE zG!rQ~lo;d_zXe`SP!J9Fp~<4SxvYawJ*wb{Wzjph7lw11C8aHsh+wp4%!uWTj3rBO zDZh!ezh?hP^Qi-sSd82!pa4U)SOShW9>*g1mFOYTV1#tUdY8E*R~#kDb#+% zcBo+EYh0Y_K*Sgiz3o)MUfCx}jrCH(Vw8tbg=|N$!3FQYygrO!dK1I6)Zvu9N_9L) zEUkv#+;cgg*4<+?T()lzA|#-M*eQY`315dxH1`h1pjzpGq>j)yYi|N~q@SHlg{oIN zRKP?h(f3Ackv$|7m?E1fBY4xI?WR`w(R{JW6j*CA&O%L4XJVEz*;rR--WQfSQCX=q zC9{^AK33z=in)E|v@ZtxHJnpci%lQL^m6PZD?S0J)5ja|oi||7$c%X@sq_gxo{eN~ zM=n?F&(0$rOD_N95ZV1$_(q1V*zVD4>BFplK~`Zm;jF*G%Hs!wLetG5d5ltdyh`xw zE&QWQ_G_DMtkU|}uC(YJ(%agbK1IvGvAidXCbb$VqtpkC^@D|%If2Q3#*OTe>18hE zfaf=P$)w1kEi4DrkzUILr0THlh4DTRm9xIuD?dV>hYFRwP|N;0L9>_r2_|<^_9A7K zb`UE2>3$KsvL`X24mc_M8BCYWF1RB$mOj&fcM!!iAJ4xpieJ+77(2F?#<%mVG`>K{ zlSYA^GC4sd(MYiDU6u!!>}xr*N;zy42bd_xW2fy@iYhG$&JDC0depdcwK1U8l7d0! zSU3uioE#5^Q(}Jfe{o_C2=Jr|yoEDS5Xfvpj6ux*cm>(kFNm4+9hFvnYXOe;?8uPy*bvSGaeyN zJNb}A(+x^vXxB8N?P%c1H)zTk2chvliu8Sr8WD*4K%<5RqCV89!GWlcG-_ZV>SK-S z8;JS@QS}il)-Ej^h7AmdeJ3qa=2I^^&FH;N^k;}(TFaP~CgyX-6fx#W6Y~XPP=*3j zKU;<`8I>442O8EjvTeBsA--~Hid$x|@dl{_ZWL)c{W(1)O~d!sSv9%{dEyPZg1c4B z4Ft{Z3Tl|_yMjNxvSXwkMHSE1r#rc$U9nE&_zIg2G#zoCFWuBj8}6>L zr!kQys_|$#fzUMwTeV$H=LQqoHojD5So=w2Nvo=;vTh7-I^2%9Yz2Yh@|4xStltajY|ty39c7gb`JD7+{@?CxVt9hu7B6u z{S^1PGd-CM_n?TYOBCcp7Z>!xizDTk?&wO~#4c`O!bvd`*pEAl5eju4R5)fH>KkR@ z27+f7(8U23Skh*dLCPJ9KChJlZ*?;%5M9-*85pXh+#|5A4Sw=Hes)2qqoTSGk`Z99 zuK8F~>5GEYz9k>{Z54iu!fZvd3i~dYh>A3jIlh-j=t_Luo~Y$5Lttx-?qrN^ZHYvy zKUzr9Y8?l^3FmY&BH}#}Ayb^d{Xw}}oP!9Ky>4xz#mPXKEQW2!(%aC^eS7r!r`y>| z6PFQGdVBq@Ma!Ej++fI4URu+=cz^!%ES|)lZY7rhS9%8@);JoRo9fveI}l+z;IXwu z`m}jjz@EY#k_x6%HJyV&A`1mq4oMCo5Pk;-e`VkxZS!{5SQ&0EA+K$=%U7nqzpKjf zo2$E&x(EJ;SIw1B8+NUSS3Fy@Ub+ngIt_!#&}Z zlkNb*x{)fQRfNkvQh$iaAm2_#slAmQAe4S^Dqp{oY8>&{!t&CE-HP|)-`ShsZ=`tZ zW)3M4>|T5v{`QE@Z2{6|nTf$raUURPmKi#H?2C`+;t6*^hDn{0=P&w;W=}6g8gIbu zVLgGec`fjON2@n$`>A1uCsC0sUr8Ovn6lW381LIm#OP+Gc{eLoI~kLqk%Ed~^?7Tr z=X`jC8ZdSZ%>~eMb8~qt)2-#7_-wMI4-nR{KcCNPAH-=HebFa%AQSkYjNEuBpSbe` zf+%Sc*uB-6^q*_>+#4a|Oy;buCeL9tAFFEqth`G#uV8W~YCcFs=&5<6vR9)kDk*+8 z-$rkTqK;Bnn1E?qx}kBYxWc54_EXXP;IS)O$l&NTGWI)j!a^P2Lcec(ip^!!(0ujI zk;t{|8AU51M8cTdoC3y_Y>P)A^CNl!b}-)9AP|>@nlX>wsVy90$cxX@3-iUc)C(pS z%;HRpK3lhJ-64g){Hp7n|B1oO&tfnIAnh9r*Oy{6X8b}|GQh_Usx)G;FV@=io*m5R z7K(U`pekX#XyexRfg58Fr%XVNlN1^Xk3`wonY!%|-&YesK9}?97uSKci_i*!j1b_KVw)Qbp(beUp)teWO z$KNfZb06Zy>v!RTC;15vhCrfso~)hromNc~0{V2w7}yaMBW8^6(r3EZ?y z;MSV=Um8uVu00M2VFK-nrE&_HLX$BCY{rBsl&5ml&26VseYM7$GfA-wm{y5~rqskm*OJrUt@A%D`P$A=~H; zfWA^*W;-3x?(zLaxT!M~9%uYxsc8sD7ng2u9|bHTJXd{|Ac`erd-0ARi8dkrSVpvp zoYMtB_B_EEjbUdYb-rf8%y5MJg&B2$L}5d{^wIYI1c(rOp~MdOmexxP>6I>wJD(U^ zzE~15WVr8JA=_G*a28!jNJz?gNJ4>m#R9v{;d+(mwFJoC4L+C2e%q8eS*SVZQDyLB z(p@|SanZ#kFY6%S(k)OFtbcec3_-}Nv;|Nq%nFP6u-kts3mbRMf?FD5!FCxlGldoQ zfYld8AH{^Nxz^pS(>94+mdvFBD9gYpUC7SN3PnL3INwGxBC|^+sF$#=AX%mvIkzPl=V(TF8W~09jM@^r zeu40+K)e;GT1B#4lPW13$e1g8dE)p>fCYy*a?X{l2Fa_HRPq}0d!2{U?(>LN@VYvX zv#uvuB{0r*thef^8j+j=lyG~!CU44Q9aALdF{-?@5tk2;?`kE&qk7(Q9$vF78N$RH zf{ES&T}EvnIUlJlQNrCQIM0V$VkakglVn4U8Vk1^92l7tR8N@&n!{CqkZ7%Z=DND>rxZW+z^MFNa? znS~ql0pfRN{8NTfT@YD_Qo?!SZ&soYAmnv0%h&?PmsCpKt5}Giw^XF%gpXHLYeEfv zv{F|j5fpQ*(!{uP5Ac;!Brjx}ixaKHYGAu|{X;sZhJIDuML@I=JP9%Ra^03MX99$6&qhg%$

}@^^;OUvqE(`aXKqB#@L0?qtH#(*f?UVmgIp%z$#un16EPBgj?_ev2~19 zmRAt3W^>2T>udB28qIv}9ugf(p|AwafT;kk^L$(@g~y=X5!Tq9D?w{_`fQc8JGm$W zT{5Ad3>do;I9^e&vBvIjS@+z_dx(*l=1^p6>@FB(?5-Aex3^}f2@o-MSBo{Xx`5r) zz<84ZFk^SYC}VduU}QN{*j`=O_G*3GONMPPrJYMDR|C)lJ{v{M zs`RQ^c``w`)u-}O0^Uc6;54ps^P*<6#<)tdp_`=U;Qov(E!)D7QsP(JHlB%=OX$5C z&iEQWx!xb0`!MZOVbVS}nw+~39m~qt`m)mXaNu)&xYh08%0ShicwLgT91UgF6gd7f ziEl_^sd?UfG6zCR_{~7BgyiB-_xgT5$+tQ}$fgxjO{z%=8eSNn_I5B!b&>$4Rv8kZ z`KN`3m3Jf;$1HFUb}0i>cey6LNzzLe+WJ+Tp^SbjEB!4ZQ_R1Y;l`t4+#qIkIRm;} z=uQwYNsP|z2jLoY@3up?zx3rrWA8~)=|VlkIuxCZ<|f~F7`K$PmSEgcjd^0Uc|X|% zBZ!P!s_oXiQU+KOY1|TQmu{)9`7#}QiN;X2RM;V$I>mD?9|&7Phd@~45E?@cA+2Ag zAyVeOmr0XIG!8-F;;~926XOsnVVv?xA6_C2sMR=xV3ctPWpD`3kh{>cpQK}aLK%EQ zrSB7TexyO3?hFu6&(J zUVbczrPXR_E57lpGZV-asF$BZT87C_Izn_(FXa`~fQUa0=K8a$sZXe?qxeiSPG2owUuFubhKhmAN-3Dcn?;8)t#<$M zu_u`|Hg3|Vo-DLViblh=QVor7|4OL&$qse1tXuO)Kho4q7!B)YW%IXwwf!c<@(g#t zn;uKwN|LFV=Gk?06ch4bJ0=rmA(+cj#kIjsR1DNFshvmw!2?8dcXSp{yBj93Mh)pnPioP_i0`LO0fDAvYbi^RtyqzvG7ykT zPzqH+Dp14)sgkr+hz(5&8HPeo(Xc2ZphgrKWD85nv_KnN2T_T#I3UYAq+(E(D24t$ zpU=7Xecwsbe!tIud47GK^u70o^Uq4+h-9!%JxR-b7W^oq$ z*7Rx!C|-1>TMV?uKs%h*h6h;1p+0f6=wX2fhx{aFPg{1 zTbbB#J||w;($A8awe*7gP=F*YUMVU4JV6S09nYf+p^#i%^(@oC((R&~9UfEF{1d&Cizavhv|#VeF^u zu5^Upr%8+_Oo#Y!L-T_7=+=APjYO? zmhbbW*u(+{bN|Gw>i+5Fk6C+`-D1AApO-L(EI7W|vRnH{Rg#SIXQohIzNy~6sAg`B z?Qp@+t=REV=?KmludW=)8@wyVkCF7ZB1!wPS7t{xJAmHj4xpDG@s(`kG82#=bqQt- zroLpUYdu=|uUM~#& zj_xx`V5Kun2_~Az#Ir2(nUcyJ0Cxj8?tXtNmBAj4{!gEX_Z)&L)}*CMM5(zM3{GUS zUyD)2no09Hk3|Vy`zz4S2Nx^=s*K74gd+871pdI6Os!5N%H~&M_a`_u9Nv6aUQlVl zH_uh>VW3oAWD?$qN0L**%1cO6zp#y!-EA3KWBeBuhw(VFneiW3yoh*; z@hdG3y*RRo@o!qZfcP}Vzhdzos6~Z$A@rI|VG1Su-e{_Et?A(;BDit5 z$Ruxi?IOdQpOXewMrh!WiK4pX5xgZBhSG~=XlxDv%lKliHg!He@fBTp%`2_tSp zb-gij50N&{%=ZW$#VXA*W=i3)31&VVGgBfn>#`MCS&F~JL-J=ssUbgmXS+Y#@Nv2G zm5*4i5`k-vsjCCNe%rvLxzor>MEbG8D)7dcsz3>)4UD26e0H zLXWkRS+z~x3eX2USpI1u?p#vdC#)=81WbQ~Z2&xK-tut~w8IqXd!SzFd#Hx!;5>gM zn@~E*3Po4uei0wKcOuBIwcfTQ$`2MLaQhSx-I zcgmkL1~72YODitj1IU)>zIHa@{q#Yhg4Mf;571dP`FfY?=d908B+j6w;6yDC6O>6_i}om+cc7K`CNf8l00votxWId4d0nwy)c&zruZ2z-5)EIkZwlS+ZoN{OtO~{Y4b+&EP`Vt_mZuAnI%Kw`l<_~ z+wj&c_HKB%S|{PyoALXv5kr$kGSm!)`Y>g=3#9r_HHL;hErv=+8m*}xCwSAQE?;1h zUyWd}J9?-XdP^L8v7-F72%f=IZXs5baM%Ckr==W} zHF}p7vLr%88FO(2E_+wkF%vZ!e?0dJ5^D7EPZRbYa z1ty~361e#``vt+Hv>Bh8m0eycyR0ZA>Au6`0UkURFGu%t>whWFCsuZ27XM{4T@8Jeo!CPZTs4~S+B>WPVZj#U1)Wz&Ql$WD5!rFa93tF&jFqzVoUVoOUf~*ym!cuP%QjMb(uo7zSw@+gzYVHva&Rk|9`7@C=-|Y7i z99O2&Yh0C3f`-d}6i{-*C5BB|7NkKv@w3h_Du*9yPRvg&A3(G{%dLa*Xt3*z;k}IE61W;*NJ@+0F@U0=+d#@$c7}K*)^)2)%g%T}P zQ{mgK!iNxP^A7$bg3)nMP_n}1->78coAt0)s@Q94Y}dyL`<>we1{JMnz^bubzmMRM z49=}#>{y6)gaO-|YfseJgaLap!iE}{l`>28#ks!X^A(CK{zyBFb`M&*8)I}ASn6G6 zl|P(_xoiPReXhqAK^}yWmJ8|$Mn6ze++&M>CkhWATgwz*usABHrtNAw2f2zbMyaTF z)n1!nO}elG4s(n{CUbPL!`txUOHl@sLw6*H-MNgIi)TSqdsv6!rgzYlzVc1xjoWDe zQO1j}L^NSX^;G--lD!S`$A`N>oGx?Gd30qE9awq>Q{0+l85kAD2SpHV^Wi(h6T2w> z*kE%j2zR3ev23OQ(S9Id zpy^AcHznE%T<&NKtfSPZ#G$TJCUER8yv-~fS!f6%8y&_i0eo&B@#t9LmxOg4C z(>2P`Q#UIq`HW77OVHtd%}NSRhf9z+wY)uLIHl}X9akVN7hFUzrHg;~_UgN$t$6>35wh+v?ZfIG-F$Kj@5-9$ z0A>1Y^4_Q>TU$+#ICuD*rh|7B<9MI;0`$Y$ z#Y`T<2H)>mRepbxs?tq9N9kWhf=B6JdaSDf)d?GUAYw%SN*l|Y^e-KRq?vX7%Z@O` z{p)>d{r@-pYX_r1E&t#4uN|4i_kl^uANQ}F1gz;_N{|+oA+@JA~+s9X^$B%H?SJ++ursdepl`x{;phj32(MTs)O4<#NU+*zv|*N6G+FP z96WoXXYP**MZ*u=WPhz=A7k!LB5dA8{tm(MnB$qNa9P`)q}|a@r_*Dv>}itcwC*=u zvthV`QzA}I7|F>(ctyRM!{p}nAa~y^<7kR;R7BEf^O&*5kyof8CobO)OM15}9tSH9 zUYai6vISJO0@9^@EzYAQm9{pd_z|!)!)j51K*Ldv9!4qc?~!a_BOJVvsR#O0a8muc+q`bHM6y$eA7jFu3o>Dw;ZYepH0L*dIWe_o zy8M?Js2=r%989wD7giO@lMhy&;1%Rfg_7FK6$U>o`Ghsel|V(EuiN}xM%j)`S4kv89V<`L}r zjve&PR`wxBbXjL*ORb!6S&I7tYfQCZOjoAy%SB-we9~Th>$XV1T?)QrU}tx9uS%F8 z!7mFMoKM2j9UXn;CA01&8ZA6eN)kHP%b)q73!Snh`cgdKg^XHfQbzifKg(ge)l{Kx zGarK61X(YVtacS=@Z5n@N7qwfW98f}yM6n_q8hifP8<`HokwVx6VK zMV9AVe6Pj3{MGEvj`q?Iz7fiSVc|fPc0?$0?bz}-an?i|mb*Kn&oy@bZ23II?l(27WT|F$xn-Tsj+(M9pAQ_d zxWe6h3GOCp^8ByYI^j-HHSBJU&9$BG2`Y1y_ou>!K!)_qqNc85P(_WpGL(GG;Q|Wgqq*ws%GKup-s{&FUks@~F>u z;5D|^V}R^bOOSnQ>V%<8sWX(yk&SdI64qru1grlX7sa)mY9MW$=Cc*4*K)N%bh~nm znGl@}4Cg)KT0d{?md9_7UEYT@jP8k|8d+-IU1MS;`+-n0gy;qdc{)glEEvX7D++zU zEE=Y`b`!E>lIuc6Slzz#Ro@~BtA^`EMHE`TplAMu6Eb{c0bscMvunCjk>O^5@3&4bEqDvIy>my9^LSVnDC$m1mEJpqsC64l} zKo6*O8`WgvB$Hg@bfa;4(pTx?T}|WAz873gk4iE#dgBz(I23$rwKi=)kCU|7JvvU6 zY?$sb)pM+2x)L>*Ef(l5P))lWV;^N|M_X5_1#1o>a*XhBP4{s-L(tw7^?>%U>uw1B z8e-JkRG_?VC)XJrn=>21<3!M8w3}WKLZ!`~V6YoZ;Xn3hqRL z8eqMvMjg&R5T-mI+>n7`WDSFFA>>E)_05qNl*8RBSeEkMn&O;Kbms}Vk-dU~xPny% zjgJ#N$}Hj}F@vsW*0s{CI4Ik%cK3(lxI%;d&xo7xNp2Q`8*~Hgf^Y_ro70Ul`a&%Zd0OZrb0Fr>cjxA+0kR(J~4m^BuL#zn&9vJ+k^d@nRM94OluW z${%@SiSgAnO*GzSedASNt-|zGR~S{_fEA}6rL!Zd^2QR!deJM}dc*IUC+3?2ujc#= z%tacqK-rmnlp)dW1Hme#hlrsnGc@-uy4=-gnWZO(jN5{H0TGc zLGLB%<{Pw!;87a%OIEq4LBH%On{aZnY*e^6hoc?ySv=M<{?SI1Dc>gQQww7{@Sd`z zuPUxhiGrOVDt*n7j$V2>1H)(aIi?~*%Sb5J0XJ43HmGmm3ZlYZ#BV+ep|aBOO&N6K z7uNYl8N4beBx)1qRz&fdUi=BNGr}b=EshG*tTQSNdrYCtBzzAIPpj1joGiHoP5J&= zzA4{>kZ;QM85v=));LZ5a_B>9#xi&ao0#O))r{}s1jm|RnJKn#;$Yfznff~jmj(C< zLQyHrD1|1zzr{+q+)61SX~30Y*3*vSeaT9xfH+GVcHgp{6|*V#DtH;G@N@g3STnC> zxh8xhEWNzjGM10Duh)|D5_rf>_?<^6qrHl`)&1%ZLrwWfdrLsD$aICW<*y4BWuZ2l z;s3<#Tdk_t8O1Oxb1crc0s{w8A65i1vz=W~X|4lcXw~JYarlQWb*FD1;iZ#PD7loT zc5q7q*O`>gA(9&iM`?>J!Esx7DOED8v_A>b&UT@I^1-C2^le8k9gR`6l3$q_mt0~} ztrq;6;89A}$K%~+vOvhMmNIS?EOt@tl(x%d+|Q+%DZc7~SKYmeB`jhY!$4@RqkQ7VLqh zfCp=f0rq$ncQCe_jvWk=3UA)aFeZ^MF!kjQ#tEi;y^!NcEJ$+9Dg^gp#16)7dq+DM z9gl!Fw_S`WK^i52#CBGd0*dH!RVlK3RHcBb{NpfHrKBWGhw2H!^HcU1d~s(+^<33V zPC8QI-Oo_S-0OtjRJW?`11yABo@a))Jqr*>a8;ms8+t4w9}odd=G$nfa_BRhZ>pP( z2{XKbs0B2)?*B!QSk)++IKXu}33`vz$~dg1cvmv?e<(Z<$bPL1WvcMMfMqaI@o`=y zKpr?f+p9-bd=gVhL@%<+Z)m9&w$F(cjwm$ zS%$7z=bs`WHz$PL1OZehI<_Z|%=rG=j0+PP)6Dp|E3qMwaVvzwXP;tAL?w17GX5Df zt358`RD4Y!!{Kdqgs%+N@khfsCj81D)S?5ciq?n&;rGZA=I*eM1L5V0U>M*W!&>y5 znvz{AG7N-g0C|wRv&B7F>Z(>MgEVdWUy|Gs<7qZv2Obfu?n*sF%AVxd2^Hc>g>U~g znaOFH(fc=f$Oq3I?0egj2u0&rM%EezYl`)#`-$c(^(gl8dV)u>mt2jpUwr=06XZnG z1Y4`kw_>u7qX~y@5Fek4_&7dJ49zX z&IYwQ%vBuQDLT$`jQgG+^g{ZjLJ8)g?W>G2cQp~*;=dDA86;_XN=>=oYXrx=(+_Fo z16gbt`V*E-n}&f^ZbT|H??H9NJ}mZ6ZJEjcm%bOv@*SmA$1uFcmw_~R5t2`Dff4IF zJ$=QWkRk-@cWa5DtpHmN!Y{k3$2~h>O|q)l^maJ>8+5EnOUc4*X~!eq;gJ`5pY<~VyAVf9YnnG#q%-$!tqfcosu7M!byn}1g}T?&-@;f=S9}@!H||N0)%GrZ=V8 zLdN?b`L;sXLOUj3j{aODh+yoW86K)urlH0xs?MdNw!`58a2u-Hfke3vTdxpc+ zW~U(&r&LC15H~r^0Y7+N}3VAOo>8!Dv&e(@KTGHWxXRKi10%HSa^qREP&qe3N z$ti->|6PLe!TSBZ4m^*LGy2|5bZ_$I%zuM3xNu)NRrfNJJ9p)@pn&421>H@#pod_L zK}w3JGzBf8CE|9=fHTUO)>BWDL&Vm_w6bnhqx4qr@FcPu4=aUc7Uxb?VeoZV?mAX3 z#Olo0mgAaSXz6w?G^V9~u+4?Xx6F2-2`wiNeja2CCyQLRJ$|~n`ha;Eg->`;^jvkd z;6Uy&LVG@yD?uJZ)yo{<6qkp70n;zAbU(E&xK*)s0F#R*1IR|n6>L?^mMlSn+t{0) z0xYSTo<8vysRw|`2)dOrzzHpWZ zCc0fk15DI33lmKl$5b-K3_4;(flpkLq0!`xvp8s3a}{Ia~be-=RcJiQos-tt#!P znJ(es!*(jzx80DZ@pYq7goiWD*(YzH2i~SG5g??8_~CEYcHei!3HY zdJK!i`^S6vrk;k7?{SZ`qc8NJo#BXZae7WWxaTw8%y?h5EUNxxG^ungp1+otkdEixVx6!|-O%I;zSh$`U>5lRbZWERc z4z_nLhGFWEhI!5zAmLOAv6Dzpm&+O*5B3a2RJ==-FFe&s_u5okVVrlxN|#ic0YFvX zD-EriEN$v;`13X1-Ke>AkoLcZU|3udF?XYQ6^Zg~ROyyQoe;+Y6rRneAfj5Va=L~7 zF*E#(y|Yp5Hom~VbgM$$3hihB^$Yx>m3dC*;=n2rdjhAM#V$(oU9sx2>ov--%R*V| zRyqAru`k%;6n~iN^{XGD8vWYDj=W|1btAKEesp>)x?zeB;i#L^94Iw6)sU_hz zD?(9C7h){fq_6I7HU0PQs_Ev&{67*L_f2?vX0mta@7% zvVWOUvHTApfAyzwSw!!_5k=W+ovKi-xxr;xX-KTCU-Vl3VMIDs@_+oC&A+kXkXI5{ zzcP>kSHD!iD&;jvZ68>)z z#P0?1hla!N8*yi|lAQOKw#0cQd;o=4&yI=PWn$?HjKbN&;cO#~fywQ8MSP#XMbZP| ze3G6JleW9aP7P;<$J-h~8HDkd1=ONK8BI;|_is>6?^sHIx)k1FdQt*?{3YpsdW-Z+;T+P}^RCv9 z9*^mZbEknAS2?yODW|qbxi9=T;MMEpU#JWHA*PJc0zI47EPVbYDPa-x@t34uShXd| z6vJc5iq%Y1d z!@$c)L-zX9uv80*hTteN3O_o!+;=nqCrcR|zl%=Yw4*d6(pU2t_VQf%$Se_5zoL-a%9Dn)CR(bj%{BWQEzPK6hwbf%^Bca{cFcpmTg!I63a2@iE+auII0i$!a7 zGx8~4BzoQ+>!vp)r_xW1Dgd(F(o2RV-febXL2@*?(994&R&>MY(Z`&YBAQ?ZDWuo0MY};;{#;K4cD>z!SA#ma9B>FQG73a3XGU z<%a%xjF}|srbIYA`$ZFZsVV|~hxSZgkh%8AIo}oZ3h^k(pT7c9`QXSMeDfZxP`vQ_ zNIRVUE-d`Cqs0DJYtrqBwD~RDf4)ymT0tQcv2W7uM3dg|?gmz&{7+*9>ReTw%4|Jb zu%3P=QmjeKuMsWJeI(sm(GSw&mk5`*Um|>B7!Td!Cs-zv^seHiu)<|qfyE+9dKt2j=9@zHa^3nq19(;4)&Apg{DU4qnmY%FJw^H>yDDq_<0>AqTvAu zT}~+NCKOA~1(y+NUGQ_%q4M}S41Nm134c)VD+o4P@OlL2S#ai_Q&a60d5GA zwBWADHs6AO0dAKCUj=T_f_DOUz=9P7Q-2bLBav;I1;+xn*@Baiy2OHaf!~4!rvsti zf~Nvu$b#1+wf@f{HVwgy1>XR|c@~_A)NTtt31WQ~{0>qp7JLq=6P^@>kASmA3;r4l zaPuq}0-@c4`y<$E!RtVwY{B0Hci4iY+b|$v_aWG1!E=#qp#{H$V2=fd5iD8oPy|B@ zUI!lP{vrzdfWk}*o{l2sTQCQNE(@NDY()#sLU6!>4ZuzPRTLI%5BXZ~gCN#y!J~k% z#DeRQtzf~Qf^NSB-+T|`Yr&_0Q2&&OH6xg@U>3ONS#T_Z-4=Wq!9EM_ieSZp+aNgM zX;Jtcf{hluc?#rf!FizDZoyUrdo6f5cqm(NBeD%!@C5`Lo)NJxAlPKV?SZ?{g4DAf z3l41u`C70Q2qA;{;8bQ?#|KLoYeH;oW&&P93yu^ZQ>Xrz4-ODyn{nu>GEUXYlmpXO z?04fqu`$?Osf=IS-tg=>DP&KkV-C9d`SGyrz+E;CaDlZVzuluL8iR-gFRg=2Q?ASK z<_y=8A}nALO}X*EE$^`aBQQ5>v3WiwedSj)LI$P#rldFsuMMtc2qxnme1)73J`WAR z-eY~c*a+$rwconU2V)UK?YBei--3jI=W8D#x;Dew2Umj_|E&$aDDwH>*M?hPG@4H< znyLp52>nhuNpsS}1mK<%Ke^d;2;L!}$nN{@lvLf{)Fe+3VV!5{QQ=Ie2m1X2L`?n6 z(AwZbE*EiFQIs&xavfy3 z4!~y*%k}F%FVtHY0-e?Pme>OM;1y^Vg<3HIJfH2s;6Xo6#@C6IVRgCpvaP#kxe_Y^F=39Ki|lHj@csFeiAXqZ4&|c;B!PbAsi;4 z$dZ_m4ezC{<%69?CsW^TWIv%&Jh#V)A#r;I0nkTQ&dBZ~pvaP#kzMV`P86L?eaXn) zESY$+*GPOKdpQC5;M+0TB?5{pi5c1J9NEth58YwN$lmY)Mm^ap5pzQ5ARr%{&dM3L zUlmYfNzBMz=*XTTI+^;0=cEb$n2;pYy?2kkzQ{QZ4 z58FCPb{b-i>}~|$otItkF>bdNP-IEW$nNFHzPc6Zz|b1mv}EFiFh=5&Y~M6)rH@AT zg_v6sGqUgAW16teaa%O9?c^qs?bi@<+La2LQO|~Xr)RVmnF~{vs3CIVZh{=9W zK#?UeBb#$%zacuA`izmiSy4~+8s#*-B_JQX9SdQJfFes`M)oX6_A{abduwFxVz!9e zAFHuN_Id*H!H3zxCWM@TB1>XMc9tXiWzosh7mV!wQVh@SWW<~hb|fGl%ptmw9V?*7 zl9-X*(UE=8aa%UB@79nVipjocWZ&e+$UY&U$dZ_m{m0#=VD}IYO_ut*n(R20;<-IS z;*$^#ARr&y7?a&qK#?UeBfHj--8kOJHX7N5Ms^I4K;$eVyA6V;2@nnOO%Y9-)mE=n z4oqiPH18U_O-avdBrNj2u-f3fFNdNd6x%&o`N%PljCbNT@xU+#oQtd;E)Oij8D`{% z70nOBkLzH&7=GC4=7%j|)xqxC;A9D5UGNorg^b^?aPlabJbG&6ad|9{rM2>)+{_QN zvr%3iyihl}hRMhi#ZpTRERshU%fnE#MX=qYr7g=NgglV7MjquFc@#_@cqszQL$N%D z@AC3^oFTYSui`6Y+-?GA`1O0n{Gb z6wr@5oIHMquaNV>lVh#FWL}g!<}2#u@d?D7JdQIw@2AfcMDiF&%3}cX*k?2H7y*mq zft5brUkpWCG21=baO4*I%K+qotTp=4%&pK!9`mPa-ZDUW4D1ofqwoGHsXZl+s}Z7p z`~qJg=YuoHIQy|)@|aemAG^f*k*?K`RIDH6q&&)y$B8ve#`-Y=7RjR=%fnE#gM|Jv zYm4$ILmtRlBah7XNqJ;U9%ag-9P399YH#}SRVR-t@fC7D*vHzvzTqE|$IO)aOC#!t zPO>jz(2qS3oGd`pU+M&rjsDN8P&VXV8+;99IeWSQU;ab3eu_I6d;uu{oQuysZXSeO zMJw}$jRZ#XEyPgfF38*=KvZUnAlr;v8yw*ZIt*VoO*@UaxuDSs+8>|&te`KVpo$gr zw&?jB{}8zem_AN=o&fx=5vGoAXe$fIvfgo%yZ^?MyE}=V3tqR$-D~(9Y-MeQvg%%? zDBg0ph~p-(S7tO(X~YF(s8zE|Q`EiPK;LTq>S|&~m+q&*4_qt;n?yxxn{D z#EArWK4K6c>va|Z`QU8P&_uaeK(rfvH)4ZwrJx&#-G~@+ZHrvrAs`>@73W$epmL?L zk`k9S1~FIGn_T9=xXaAu9&k;CW6av%cvr7u@ttP%T1WJpCfukn=i9TaUb|q@0;>lZ z{#zdKx}c8J7^-$YxE6D6Iu*^P%S9a56*sW3T(I17EyKt4`5Td|WSsViao=*cA_h*k zhw@PmQF2){q_Qgn6th17E&f{@EM^FJ3q=Q0L@{#^Qdxxq@ZH9$a1s%6!8D`*uopgA zr)OZMVTcv~jLS6-Uuuk(S1$O3kWcAi~bK|AByVC>yb++47O6~z8A*9uw* zH{3eUcjeu$3+}|XM9s!ilY2>|b zcA7HW`l8itilUz84$3K-6AaJS?mv)}TL!#8qWNt{^J$6^d{&I+aY6*7LuYuM?+za)>x6!lv90Ai3aehFk!kpQeO#cLox5O5o=CO!2QiTGT!h@J~7NCDs(e9p8k^evQCva&vEYc0;K9cpVW zl*+yYH!B1Q+;!ycO zefgW>@CQf%hu7nCp5;m*SHr*6Zhv`$z*N8G_%&i^0gmA%0`kGpq9HT-3jryOFM$-L zaUQbd zwglvZi-~UH`VWF?TdaeLh##}c0?1@MDnO(T_gEH=SwHzZ^w!~I1N^>jFt6M%k^V?ocnkurif-8u0V(l`%`=ytYJ@JE;MYj z3HhRbG3qOQK4Pw6&msW*{NMPPkedZmKi}<*WUe$~F4uSh@O#nBY`Ol0@|-$sv;_<& z;MZ&cgMIEL0JCIgXuK+Q};eV}O z-;Oy9<9Z!RT2Zcj5OcY9B>?*zF^3Zclr;WXQ`U2FS$`$~>o{>)j|iw-N7Uq+5$9^K zTvzjBGTdH311+s$`QN#UR) z`pU%!QGc(+SIF>Nt)BI%H)JIr7?M0(N4gC$v=}!MZz2Hu5&y);q}VN>oQSWIo=P}D zC14*-bl^Z4*;7=CSGr>*Oex(g0`kEzL^rb21ytjFRzy;bpbVU5l_z_bHR|5=I7|?6 zviMmHe^zF_>Nmk~G_*`dYz8ASF%Jm7Ci#U$cjB$Fr;=q!JWsD`8(@ zz2!1-9fg?V@DKv>!F%FdQw1c4??;8HdOPCl`e8uyT(CV-0N56v+l<4mqW3vIhY-c} zO?*oxuJ>cvgF{nE8eInf$-W0){zLI^8riLp0>F5DeraTncnS+9sQB98ekZPb@olhN z^(31M?l5uv0-yUV*S5%2P_DaNF5*nHT+drsKeJrD_^h#93vTx<{t<*&h0owyu_~O- zTy&ePOSh>;elBtWVvr}T^*L5mZxH4R!j6(HqWDzxCNY7-qAR*{3?{8;Y_K;4M>e|{ z+w2HSC#$iSao85kb`fS9xogZeUn+~uc41eoW)x|*ix;P_{G{z=?AJdf)dptQ1_448 z%v5}Z4EyQ?lS!**oT8`~%&~|$!OSu|FPQxVkzjg3IucAT1fyTOO7a;CW>at^nBG`0 z5muhZ!m-SA;1&e~oVmzdBbercl7eaffCSS^!Sqgz1oOmiaYRId`8h%q%wzZpIUk%b zXd08+NrL$`mM-G)eI;T}FuxQaGOafYBEb}rf+;{SGsbLIV>Sgxf+@s;iLi909fH|^ zi-IXYFvwjan7Wxs!BlpUUdT{0Q}B%h>v+A4+|)=Bxcor@%NN2en&%eGWA80jn129+i!rk1$iBe#TotssQr5E zDj;bX^HB}ANV)+@YlGL2@_u4`U(vrKiiXR!{{Ydj?=+qNZMPTcgNYEgC&&v;;h7&Y zxLxHr@?B)M$3q`mz{9y~AF4Fs*S#Od`F)Iv^8p3Z)7fS@mBDK|50Rhnuuj82?}Nbq zA@RWiFWVUS{SMr9Fu=ZB#1UpZ^?Uf`Fv`Z@4cDwO%vr$DU^&oJsf?slAjx&XF20^PNALof2E)N?2tD?2cX#*Prre7-D;(miaHWa+r@?uY zH;;7de4k!RTntra0^9+9a1xnMbm1ArMf~aGVPFs7w|Na#r@VX&r*$RjJpd+9W_G}x zC*E99DBP$Yv1aj}z;|(cP}-O^B7Vf0Mcb^)K0O8$2eC~fRuaYC2N+AsXP-_SZN|Ll z&!{yXrdfV7Sy>m{hqyK$aIR3nhSa*?E`&%JEDz7aKeTO|9oYiePnk2?1qihfs+je6h7}*}N84{LfB8kWYWh_Ph9+y63XJ3<<#t_jf{{WuKTl|qY4i+Qr%`)zkX_#8a2Ma5n3ZNuT#MTse&XHDVLFMcfuKV zQAx&h5}EZR#E^cdJfy0IRl5gf3TMKr)T$%+IftKAvz?`VM=oxL z<-uw4RYRDe$h3uf!pLE)JHsGDt0rbVWTHVnYLIZ%o)Ki|cN<2w8Q&GzsYF7HvQ`LB_!$;ponH}8+<~H6p6~X(V*%+AdFIBb znsO$3rNAp<3V)p#2Xq+58U1xwA~5pk&!q{VGr%-gBpaxnZ%Qq~G86WF)iGz+CUi=|1WY$rl+(YEPkGaR8c+-|!8THx%5o2yii6Mo* z)-9>GhWCNE)7%d|1`X)}E!4kl06JpVc@Z6lY_j+&wGy{BPpRxF~jS!8(8Wf$51|+lmV@LcEgwwo~-1%lKP3VNLA2) zk}TAwxgI$XZ?5YAdPm!a$%`IzWG`8tp|a&x4s#gI-94nwHK9H$DjHjtD>0T3>J%l7 zE~INp$SD7U0Wys&3^t9koH85BRZ1;gpEQ#0>W=5OZpy9b_jDO>bQuI)<)kX}xEq@k zKVUt5HGiO4ihPaL1?iA9UwzE`lrpv3hI`?tfyNmLHqdg3hQlUCiq=oY33Y7CaeUIy zQ1sgg9veWa`!$xCeTKR~ZT9VtB>YI#)^Hm=fqbSxW$;I)U7-^;DI>uVfb<-aWi+6S z;)pUJ5gLMi{g9`?W2@ab*MT%hD&q#%^zz#$v z<1usD4G0!ck)Boz{i;a5E1ms~Ckh7z$J=J=w z*wD!1fScf?JFf!4K{!@6FL76CYl)E+D@j-OiQup$*Z@Cb~!uC{)pP3O2o! zo~&)1Ph7`VNDT(z+a*+uKS-ADTqDJ`{42VfaS)94$!BIJO{cw0WDYflUWmW-ILJ^= zy<~_X&mrmd^CHJmzL~cPMa~}8t=018@p$h$$vm1k$@#v>j7HC}^LMwx6~$|ZDsFbe z;0}q{G}LJyt5ZAb^eSpuOSU~pHr?4T1hzTI=VmvOM-}7dvK@NDBGrP4UQ)7}=O+1U z01qHy6X4uzM6VH!@z@Biu71cV5v`>A*~yNTd@m){azZV2CMMZz@ze#7k-SDhPkmx| zFsO$ISP{LLfDWJ{{Fd-VI0G{XoBI5_ifT;d^r6Pgq6WnFCJZA)LKTl6kP zBYLe#8m=8=-H$Z-U#QElPO+sMc9w2R8ET8_i4;ws2W%4?z`+dQwpPF{?g6M(J*D(* zZ`-i0kwDWk8Ib$Vt0;H(YLvzp^nz=Q9YxVo=r+4&HRypTssdpVsyR-C<H!mFVzR;ce{C^{3S#)+8q6vg`A6 z)<3bplIvXZ_*^!GA2Wu)&;v6LICfLu>M%VcyS}5ey@6Kjh?TLhqqH@gX|~%FA>Lzv z2b9ac?j(-Yd3N+X5+d(td83+2znBU@ZuU$d&tzKk{;v}RUkJ1yUj%b)*gQTz=k;Xk zE*uRKH!tnNHCCjf1+}Y9Xl_J`IPk@BsPIfgLHHI`E)@b~^kAEpH-Pbuw$~@O?8LgP zdHj{WBhVJp%em!GV+7(D$S;!E#?Yh{j5guH@8}mSNkKh`a~aMoJ0BLdNMlyPn%5I& zb$C=ligiqS{6~W1mn)X1MQnk&ilWBf;I&9HXGV5g$VuzcjQSgegovC##GWkI|58Mp z4u|6&V6U($*uXhK)l9M>%1JibYS~ndB>W7p>BxvVji<{kMHMq%xjy1~6;N)!PjU5$ zT6JBfk*zZrgeToE3tGYOR~NbFb!_n5N{Kmlw}g}v6S)=Rtwz=YG`gI9aLrrT;p-t9 zNX{@VBzSU$(xwQQl4bj+v7y(M@cS7Xu|U?3DPI{mO6p9pPtL`g5}AT+8f_twQv*5r z46rU(o3c5?oIV&E{2{wM?jnM$9!I(2B2IRxhtv$@*EXp0V^>I9a&vlt(hHUf_!f)> zdYM`VC>YIdfVzRw<)%hxLkWFFGYU3=Ie~2bFH}>8j^hHo`+`ls=76OAbZdT@?G<3s zxojcrV(#b(2rjW8WVo!|g7r}j)AgKX^kj^MoYAnv{BpKe&IousR3>NCIX-jo!&Wf6 z{GtdaYhbipuvyvih1{NKXLSdEgHSI7SxI+hc-PB>xkO5#MFz+=n*KOXO^d#ekg(V! z&bxA-#4zgoH%)#PlBOR_o$p9M4Yd_JLOfOs2UZJ3W9wFCw?qkvHoQu6y$e2ac%83` zxVIwROLMYA$x$>KUP&qmko{$1u1>?NQS-yA3Lb5EjnPyhI_3TMXn1wpERiHQhC27h zd(zYg0V5ZQI4(t*In?%0dA#@Sp1<>g;((hW`Hq$RBnI4D*rhH}YVClVS6@@E{|f`I zF0Bh2 zpfT5qbSWBh9TR9yk5^ZH-gMXK!6aym8hy-7fm@Eb{F)_{lrZcv#fIHRhWzM`9;ac~ z(EP|dlPEUw3cGgXokr;6KXP;wi$`7`H7*Cgi;~nRHa`?JIixj1E|w)BC=-GkiaBR+ z-uV9{D2=?iJ2mpE3O4dKScMa82$*DpBX0t(97#AwUPngE*~n`t8hJ%gi!Yv60d3^1 ztxwdp@yPq9Uq(yum#nX_SLO7x?N|(xl(C0`I&jlFWUIQ7Cj8>_QA_6A=c8}K{p>8Y zU~Mj#ao-e79_6PkJ^=iEm4ri;_ zdKMRv?r|v~NdJT8K2&L(xt=SUk4Ggx!W6&O+>Zp_34-2olr7oTaLay3-d;J8 zgfS!^qpZo;0o~H(xxM_{pri@5X1QSjzf&20p#Elc#w$RHdKDDc5@5Dhj%(zXgwde08huG@38eGh1T!Wh87axXK==;O_?vOB8blKb}e9&!4(v<^Dl#{P#0&Ze3U@qGDdB$f(}ZU0t2rqsrvqnBbl(`9zbCqc;+~H_5g6bJjl=VO^=Uu%%tBz3);J z;8(@ldN#JO4se?!@B+Rex+65y^Fkwp;%>Sdh1Y0nH&eXWx@*MNoxW@tv#rZ^QTy<1 z*O$NUaNq4Jyvw@A&n(ssR=PH}G~?60u?2kr-rKBf`-MlL1=|&i)Y>oEnJRK~f0mqv z3o%bZF4e<%5nR#NKHa6ZA}XVn+~W#;U-#P~PSxFxh>Jy=B3y z5TT#9K)7aNEqlVmcFRGI@Iv^na+ECvTM^#Fom6)h4Psrz?aBKHSD<{ z#pPVodj-99zUyb!>vX(MTfJRNbbj6>PC7z#H#cT7thtOiBDUW$q)7oRizP;_Ao})F zs4L<>FQSMORfGv5FxOv>?;y?{c%K;49t(D?JP%rt!gG%v24*~#83b%owmu3EPKfp+ z4-N(1CYC`c=wDjTCkhhzQ)8G_je+F2*t7gQ1~s|UqO&f<wMzBROJq>#t$~UQ;70C&2ca#99Hio*R*c?QsjW_Jpanzs5%3(M7Vt z25Pt78!IH`0D2mv-$nV@%P_8El#dOukz$#ebxU7r1}RR5tY?f^|6${~My0mRQ*-+i z=zuw1(W+51;Wpn=u3WrOWs9#(MnH5>oOa^fLZv2js-ysz1$##q&0s;z^i|ctox)%J ze8a|dsqHB8bxK2s%0Nj(ixfjl%V|jvwo^V5P^OU!rw?43;2&pT*@5cM`1phtB#@8e zs#}}TrkujWD=}Ri2X0lm^IVrH?n8YoBFeQhG0aq6W-P#AN z5V!1{iP6@Y#qIP7hIKw8LL7COB7*%m1kt4I=)cQWNAPT~mq9+m1&_W~x@r>2x=e#B z+C|~^VFC43StI7lG@|+i5NDVjuD9hh7o%XhBZxNLjHqq#cGoPd!??~RGRDhj_o*A< zy6W91Fns1G7~5Egwqr0FaYTZhAytgEsn&xXv;j$*KwDb4HIZ!}31e|auw7sf#3J~g z5N0|_CDT`Wp&0+Q+ag>d!deKW!xggq$uEvHW9P%|=16|gZccB0#BRVyE#1~Z@W2E5Qx-|k(9V@wvnArH*NI~XH@+QE2T zI~W9M2V=&)X)YjTPYE0?Mg|8xgY7m}tS~i0-Jnjh@GH5?0^xAu1Z1Xz483%@H0H8QaEFHnP$ZBRPO$Gx z$Z>$qojXZ4M8RQ%8{XJD*)UL}bxq^ikPkohbn-2ZF3R*okW3R=ROWF#fS^8|@|ALt}*5h?^T6)!SQ%etH#ibP7Zi9Eg-*Fk; zir&QyG+0r7sVYt&Fr-Y8A;rMHF57KDQ1qsBhB4zkGW5s`xx4}c$F_!_M)6_|DHXY& z=x_1_d$b))tJhJ&STTN$%VY|93&1LI)_ zHEaV0Tw0Vt_HIJaVoE@Mrc?gb9G98EJ2TrzWu${-!zqQ#^PWi<2Nmc=VgO2azN-~$ zq>gi{WKLy%F7zjIJiq0Ru%tVG@6k2IaSH&{wG3xDeJx*B2{t~?V{KU=fqpJ;T}4i} zd3OnJTBc(-v|MiAklu-NTnw92AFgzT&tIouuFqyFZdi67^g7Gmp&J;f)|14B<}O>t zOn3HxxRy=jboiP3NW$(2nPy4uOpp6$8d8Gn=Bsm**qqLPv5ydL1cJ3!JkTcvfziQ= zjHXWix)$|~7N-8q?p9-VSi_OCC-acZ6@s#I3j6WM3vv?X1j>6-9NxOj{*XDFM2YH% zNfe=+M9~RNRO38WIa!S(09PV)oWT zL|N%h`-vp4Eh^TgSX4kZ!%Ve^7AR9KTw6=9E?9zG%igi#35Ka3QWSJ;3*zAO(>+cP zt)p@!548d%!rC_3riQ${y!*uI4{D%%-oV@tcU_`@b9>$%A0Q_+X z4Cc)+**vvTgRtTdoI%($bv#mGE;{>s^6{F#A2jyRGxjnZ@TCR?m?Ie0YSkI6$@Xbd%95)h3n z?#zHu%hZu|-w?1wXn~p|c`=%;nFZmc-({Qnebt3zN^ZB`!gMLLO$xemN`~W7L>05E z>J^&NI;pu$QVC=NRC0o;3qNvs${gYS{FbS72spnjPbR>1P6Be--{iBushQvQ=jZf4 zvA~iO^V>)A*+;N)~&8xcdw4_?V95 zz(ds(*J{2lGmSMw-g?x*Cb|~1xvn!i`8nleV=wfL&2t1E61TSIx^<%GXmPq*lc3WA zR-{AW$l{rZf{7D)mYpL>3Y4+Ks@ZS3X7>9ChiUk2{93g%`(@N-zrzgWMZvn7PUvCw z%e`6;u-UIrYiGYh%>DR}91+D}#oY-#A2t3o`=#*QL{reDseviF# z^1l<2&Ix?(+w3I1Zs=rod&74$jccNuWTOo^5^U%#9bb=`8toN_W4O=C)ItDMeRV;a+JdNvOq zjgN9m;L5%=KxdYVOY&P^$0-@_w{oFK=VynWIN#FEZ?&~09G#8Q&2Jr*=?0RzfD5eE*EspP)o;o{jGS40a__&Kc%)V3s;~(CC1EB==)1FJB0WBLq|- z#*`v&mSj2ZHh~R!vrM2j%LK5e4>{o_;MQ)>ur0_ABpr!#=ZhMg!0kBCVTsds6kQ@> z?4UmA5p4~=4;a9bcRHX+5M$6*y4DV2Q&0)Z%I-~;ts5Xj#^^?)p?f&J91v^`{!`u3 zsR46Dvjt${k0Q32m)773g(x382=9=iW~~H@$rem^-YNvO z9DF2NIyF7T*acZ&&imoo{I$Cn*y>c?F63=MxXUpm|Bq}KIjDBF9pu_mEf7<(LE4k- zw0LsuAU6%<+9Prk!)-w>+{&s}HdoIq4!T*=)f;fG-T=&A62V-(O;Sg=dMm8ql~H~j z57Ro5C`d_g_0YHEP~xq1hRw+X7%lH=2lvsPkLb{^d7?3PNGO%{|Ap4wm+%A6FsC`S zbin(8;RrwQJjLH9&Ki;w1p`42bRgK%4uVicoUp){gfRZ->FW)M zA*dYwkVb_Z@D!qLT)crt9|rGaB1%x6pn`1r9Fm4=xiku zV=BrdA0Y{PW6gXNn9s+s%O^QvI@;N2%g~|t@4-S1sHHn?En1S;X%U`zv4xe6Qd+9} z{IL5qS?v?E0UAISSk@M3fT$k$_0QHB7Uki;jv*{D^EDJ|d@C4k>k3!uH@&l!>J3tC ztmtC!OD}swB-JzYl!EPiqhyU|{gcy|ep&d!a2HlfD5=7lupZm`jz&9LNp!SI(~9lt zj0L2ljns6Uq#X^lK|hQL^jl9Q0pC;m6*dAE9)*CsAME1)N_AjsXQrW6VR|{2u0eq* zby~h>T`#?9WU5vdRkJ=@dM-MColfwD zo7H3(D0KWlDRLvW9-JPo?b6UNkZRcmO*jyK13zpGEI1k^bO_mts+~-c3WXo#q80~d zt~|F~D1s(rsK@RWjnxCs186pfDOO4v#-0ueEMf?YZ)O$T_d!dG%olp-KV!_R=x=4*S^@3N4lR&kOueDh?_~W-Qo$0>v7nJsvTa$;}o`JRjtqn z7{=tq{*{;pacLZKFJ=!5qJ!>@-ao7wjmOe1yXr8`xv{jb{ZkSDqpGELGU94EOI>R5 z?kI@-!TNs|#fGP%YG#(IA2&A0p7m7q!J3}R+DeWL7>6qu#J&Ha$g)DRP~?tMy)0I~ zEex;ZK@H#Ra1d!IyamI288vlnE+g2FN>m`53<=wcm)n+dBIP?s>CUCb!wA6gdL<1TMDG$%KDWi9+d2@(MS}jB)gb( zQWmY%CUF#5BXMZv3=DE1iq;51Q7`XR*a%p76Km9Oos#|-nPq+WC$7-@_^lkrs3u^V z3`M5G`3pUG#f2Xr zma{KgF&w}5)2-E?j^UjaHGt!8aLgZF#VTM4Pd-2`G$xPI)6I`WH_m4}(Z)D^KS#pL zLl7XwC)^-wM3Q4Wy#rYc1{zEd3__l4ukL7%d2lgU93t=dhVI+T@8Bnah*uH7;y70V zio*e~5sArSX}U&rDaOFB>B#odWA23(cDLRPm8&2Ynu}FLu*csAz?2NDkpb&ISFClfGh zv;dF*yY#xOgpRn0T;_>6XwuOQXfvQQ7?H5+nC`p+OhEC5QabrQ1QNwTY+Q_Jn*XuA zXtSdMx`8yE9hb$0wV6&sK&wN$MXt+^YZyARh9<2xQLoqsMnn+t@Y~P9y0W#cuE%GtfXferZ{p_S^JnLq53cQat=OXTuYrTXL$5 zb^f+Rk;B5tU=SX-bOW9V+<-pU(LWC2bXsCb zItGkEt1pU<6Hm}v4mPu?OkUT@)thu-GPrv=SisGTbjK|)M>>Mg*?9%;s^f5K*ws*=I!_$%(#Xq`w?qkS6z zAaA<9LDCq%)M!S|8tofxY_!+WXlS7s><8?rZQYX>A7#nDE#W^jPlzzp!wXS#oLG(8 zvZ~_(HN8sNp)md6!`%$-L9pBUolIV0bnS7A5dgz>1h;jdR(|m%-T9_^PH?+YZBXNM zSZfbYJJCK}D_V2#ynT>co1gS?5WuN|TtTA6u_l3b2m7%6 zk*f?biV8uusJ~dN3^z&HZxD;g;4kZ?Rf0G_ECmaASQYop5ZE~QAyhRo zULBQTWb4lddm2d$E1u-*Pt}n8heoC#MUL2Mmrb*Te_nzFsh0DPgEyEGo&My|K6%kM zO*zbApeGmno>=*y-;kSu1-{G=2(A~*#c1B4L2l)kzeg^ucuTPjyJlFSkVbD+3r=UR}z{ zU`l|_<6nkKcitjgP82d&K;g5ccHT@Ax62Yh=joK8F!)0TR#*e5%d4rxG`n+;B$|#A z5KHEOe!Qt;K?y#YGHVjY$pw1`M@Al5^M?Y<;fK+8IWKvSiVx1GYR{k>5uAl!^-WuN zP%gfTXhSV%idY}wtnS8ds=75x;pxu1l{a{WK&*zRJ9oC7jl_dD`>Ov)B5Z@ADx1&L zBTREHO!GF2Ako`8IX~$lkc-De8yr55v?{5O>MHOUQS^2f&T33*Hg;>reJtg5qGiF5 zmH-(>Fx7OnlF>vh7j1@mZ!PtIwMiJYTQH#Bm7vbBqs}0y)0t)cd(BeLW&MjB&Z-&s z1L0kZXk*m^1$^`!A8ir+M*N88 zD9~S^{kkufglqRCxJlF=ZxVI3Y6ied4Jj_HfX{riEfg%=djV=uGi0J#5Mk?4uyhM$ zODGf=Q->thzL=ksva&@iu|b3}^ree1hBkq{*APH?J;~0mjUhBvra`4}V~9;hx!cB& zk8xwDzeT)vgZE?9K_>mcNY-4fNq4#xTsB${2sN^jDq_TS!K1;{>7rl@$O)sQhp#}u z09wa)qqcbC{?LcWjZtQUX_Rrt(qPiqMe>v0{RXRSu+ga7&@_8mG;TTS=Y>ySi0z^$ z@gIul2lFtDJb5#&m9yw_Q!e7I40ZZO7DXhHG4~ zl;{Z6Tr=`)-8wL!A=)Uw&b!+JQI;H*ZQXgkS%T5#U$%rc-#=VtHvdATRlgD2{My%B zW~rFiFz*T_{S8?7W0`!D1JSyx}4*|Eel~8k91r(JCN#vI1n!WfG>bXPNw=q`E2}u?z8AuISN5+s>HQS!wp6A}U|U zN`6wUpNNqg0NWyRx|3Iwb;NZ7iEa+vtvp!q!gLQa!PH}6wuB;$hZ2k26yZkb%wCJs zmf|NViaKOgVsyN9hYL_+_f%cF^Ev6f>c8o*lQL1*2fbftt;a*U4kETR_;?(;Xvh$ zSQQWz6ct%CYTa1G1r-n;$1C6M3yobx?1ccyb%^m(4w|Mh>po(s+A-t#%1 zv+w8JJLWdv#i;EQ@nZWp1sHe4ZM#n2%~$GA4R1Mg0--6bx0sjnSS2{9%v7%uC``;Mfl-@A zM6VJI!C2>2*;#~=72^qo=dWvZ&dA|7-T#>BzkCo`KOSK_X=C5Ay3dwRDsv9?V%j~T zj8!>-XW}}N$47N+uK1P)a|m?@Nl`q6s!cIBhfsGMr-`dgN*R?t)mHy%*&)>J=1Y*) zm`RcOdgO4o&;|M8FO!xGmky!YRj?9i4xw&0hfp6&j3)HqcceX{ZM+n(j7mfaN1iAo^Cm`{SuvrJ07In;q%5O58JmKx~$Ap=V2HV z+_&C{o>6YOfjMkye05&v%yAwUZ}nl*r))!K-P6tbHUi7aw>fOOqwKKh4KVt!sYXJn z^YRJa5YmtKu<3*PZj1dyH)Ag|3)b8BANY>3Z3%nW)L1P)Y`T;(l$Bd(!`YAs>yRdA>aOHyJ?e**mk{l znV25>NX7)g5Wyg9BzRx6oUs|?Xx(qLatWTv8f#(>nA$KdrH681G^DL=WZC12R~b;qPZ_zLs4FhtZqA#rH^RG+{R=izhTV42UQe`g1VayI^v>4~ z_vYkwn!kSD#&X}W+H(1h?bqt>uxw_$XI}a{4eQ*pgkpx>tZ}dY-dER=v5~m)2m0VXdlLiV*On2ps7J+zQ;QFc3$A#Tw)w4Z zn*`td-1hM|>+F7J!4*FkxzgIVPCj}|G2ptOnZlJJ8M!sGjeyhG}_do6fI-AIYj&aW{+}u5mvp|!-_EJbKyk^eb8a5}!^)H0nzHoDX z+>QmCo5ry){p!qx6W@+(ey3sc-xqxM?O_d@pWJ?Mf--#NpYk=+ezX5^VRXM+xcRlY zoBt6RJmk3rSA2iSg418g{&B&Urg0+|Z0Q(xz``wwaYroVF0^n+GwQ5wPt7~z*Gdah6Cq_G=zZat~&77OeT9Rj- zF#2*BGEb#Hv*p&|DDi%7%DQn`OD2(=H9xg3xhNS~8qc?Pr&FETOyY89aeg*akg$|o zE!`a}w+=@|Iyy4z7iSt;GU?o$jmg}og{hWgI+vW6>L5BhU5AK?!%<5L`L04f8n=qH zNrZsP#na*H09WnyHZgQKDwgT&$|iHUR3<&ALfsK!i3DiJi*fnJ(Tts}r~$=tH! zC52QrnV6H#q?4m!?eR2*_33q~Y$n~AOy^A;N3C3lc_9w9YLw2KS)pXQts|9dpB-9+ zXPVFnFe}u8_uOP>Nj}u3avh^at<)saonxTuw!R!TW(wIB+%bmyIZ$pK>hhJ#le@D* zm&LofE^l%cJ$Sg7JDeSw*AZ{a%?hR3(wS^>T{5dvs!G5_$MT7}9FAIPa=sXqql9;8 z6X&uvU8*i`icv^19kvRH#R@n`o*fcCl1di~BG}SNIjs;>JaUxJTn@|qSIW8Tu*`j( zfV**jjkxcy-2J(kmVz!M@jQvRlhaL!OiNRSBwm+FuCHy+cXmkGamhmjXRS!5Xc*!h z9ZR#Bwrsp}l6WX^Oa)$E=1akelN*wkkE#|G=bXcp%j3DV#X{VfNu*jgcF`=Da@CSe zb?KPQ3LPIwBtqJ2*RDAXLaH^C&g4U>w0(|uWRvm4#)-2> zsXs{g9gbQVqd{6Vs4llLwq#;SI+SlurbEk;Io$%!niHzu&=pTp`*jkh^Ak?EtgH3%6DA@} zcI1+~vRB9@vt(Zm+q1D=a#8M13Z2k&Lg=K*z|J0(Oebasa^e2xM!x|R@~$E;B3)Y_A4r)j3qcw8Q#_9+C_(< zkacjSh(=f7s;Z?@H$*2)q&S^W*`B*_I6R>uJV)+MavenYaw_FgWnLZ%**Op`)}HFw%J8M1TAQV}PG60^vkJUwc* zl+@(%{A4~9*BPO+7B53KOEcM2G8fY2EZ&k2(F`QxE$y@)3A*J(f!1&%K@|^miUqS) z*GE03N@!xLZjkUKn5CkdIC)wqkqNoRA`~JxxI=>%Ixm%8yxh2tTc#aZk)w$*#uFym zMx>-ON*$4wLN-flZ-kRVxvq|sZu1C0JZ&RsT+^*Z+c||~cB4(sbK@O_m<18z&S?;?zl@ojjWy6uUqZ{&M9`vXiDw z3Q5Hl(ZoO?OgvLmvuQ4_CTnBu$(FUcGjaLr%IL;WXFT81u1jiHmoB-*9K*7dvXzNd zp*iM(Sg%Y?p0;Y|;-iy^!iT8XVN=>B(NuIYJkSo?22ML!^g_C~;`ks*t7e_1o6M)u zg=E00bzNFT<92*aCYz`5x5Vknj2G+U#KZQ?uBQ&TU^+x2Dy5BSOmyJ&g%^5IuyYzw z{&mGJ3p`Oxku1|}fTgL?rA*s$303sn_#Lq1ZcQO2yMiJYx{*^yW3!>$T|vu3ljl3FPmb@ht*(u&>k4`|F7Bu z3Axk+63Rr+qRJ26``R*VIFuY_>tFOc>jC@7xZ=6Ryw~y)+GcDO*ahqK%$t z+j>2iF4hDqtY{$^NK0w5^iE~U8cSA7m?aZ+?>{HBzMXtupA0b~U{J4n{tzRyQlF+B zKyJqMiDXBT+J&Ilj+O>*%Y9#!4?v}OwF1l?%1ysRfuiS!9lX@K#!d^eeATUdi=TT1S`)Log&3+dA5)&)`wD|s8S$o z3KetE^j7Olvq>h0S_>T=#e@oF3i)FGlp>JZIR-A@Cxzz4nc4+IVq0gEMaC`sx2<%m z9_Ns(t*nUHX^5E$hjd4oqo}pyrK`}2Om=OYMGZ27kzz}diKm`PH;Og7=9V~@S7%ZkbC!Oc?Rk}$uqhIbD=u?Z*F?!-WMz?QznoKCnB-to;k<*eyr38}n*=hDm zQF8MPlm2EgpfM%_h2~Nm``@uHMPV9 zd1U^;kg?FEDYD6RKtxY0P;YZNMt1oIyD(zwzOyI8qO!z4p|iM-!7M7!YRR-g&wgx6 zRV9eU&c7n8W#$CB>=_5`bcz(E$73=e1;HfHtdOl}rPx_(x_|QIi4LGmf--+di$ZC5 zQY9ryJyofrGC|Unxv8MnhXR>g9?Y_&!gDj44kTqotW2j6Ox=*1mf7?Tu^6J;XWO`V z17TKQ^dgDPi{e7i;$$+x;z~ZA&FkrVG{eGSJY7mcJFnJBSW)%Lb6@u=x*i56bk?h? z)A%uB>TvAn(3CZ)^psrtsIiP-(#b6Ca3Zv3V~BNg-LF~$hq2h4F>Ng^V@54( zSbTQY~@1K9~kW@){0$yvTgj2Lbm za9HSS!T)4SdnPnahb7b<%4b7kR?aHW%VlS+8l&%xyWC6g#C9gP8_T0~NN^U5W_j?$ z4rWOkP7F;9nFg|RBXJ#L%*I#~okuPk#+4pIlRFX}{OKHHbhCBcJh3&KOs>f#DqIs& zYq8|QoH6CjmARCmJGU+cf+dE#4Op2=tjO);kTv_a0+fhn*Qe4IG3$)CWO5sJ=g!XQ z6i?|C55x?Ecj=1mZ~`gL&Otnz%AH8ApO`CDhELdc>2$zZDGjDjjj7LO^%`g)y*8a$ zpAL}=)OSWCvI;rNlqTy3qt<+AnsX?bi?@t&1x}Y^TjEmFXU;GIPMzXzPIWgk^i8oW z>UuavTOSj$1uWi~IB~`)M!aF>jLD_j)%vzvhus;cIAN|Uo^3g?yCRK@`-XD%x^!)= zbjcWYwKzMSsV)+{+%s+F_+2HQ>G*Rwot~y@`;)EIyr|0c(Xk;r6l`u@Q%H3rrs&o# zk!-DPX>Jbb@mgg&(!?tRTi^W3Y zN*!Nla)Z%^CbtBGB;A8@7@C|3(#3sm*+x+r@y|hJ`LTuW-TAHE;6%N-9EQ5PLsHX? zxm$O47-}j{Fjwvz>iF-%_wwXx(XlNz$^-%sNJ~4K2$l6JCZSxqIGiH!aZuU+OZs@- zb2^7^-_&76@MyZ6&FbjRH8`Yn=$1328$GRX^~RxXS8WMuToH@aH#U|Hkoe$=xg56S z%!av`miBF2eqEaCDsuY9l{1GaCT(RFDjxJ(nfh`lqrlK)eWZhP6l{8!-CMhTB?CsL z`m*5`np%4*k)6;oF?90OsWU^7bb=XPF0`!B+0{B~g+4ei3*Nc9GGq2%bE|aY(aBJD zxK*^3@hN`RmH5LmkSX1y}DKwg*Y>T|IFq5h&VnI*03u zjJ@GKB6B&kIU$CC3%5hkyF^yusSjnm>(?Bn(qvwWB@tVYLk!oGL4gaW!`dLpz3bN; z)>c}muz$QfJ6w5QJjh+vXXo}rFU(kTp`+5tUHvdnKQ=*;41rnv!bAn ztB4I34u=c^FQ$$b1L4YzL!GagbdgprTn<}YO%W^3U589m5>(lu1Fl{;Bzzl+BsZ=c zI6UprAgh$i7l)?l2v~9D+Tq&d#sIr>{_6%QXup}#7l)l>0L_bDb2aX`df~98B0{cQJJfVA0M1{BF}svp^xvhE zL(?Az95_$z9WoNpqZ+A&p~9Xjs z%^oNH5&@4~!FFiUr#4q?!$*rT%Onk2{&ep~12n z2v+gdt-Cq&`d?I(-?(kDt7&-LpMMn;dD^-I5W@AZ)>V;Zag1Xc~)g}Qyi%? z&)vJVQa#Kw>-%C?cR00qjzTMYVz8D9z{;;(Am@BxXEKqBPf4V5Yp2wwC`n1*udtB zaa|wpSUWeBT}Dx4n7A(4v9TDrTw8isvUPDLwz0)j)ZO^k))MrokjpO5#F8ByMW5KW zoo8CO-MEvnAudHZ-)_$N79BE)(2!1P*K`TFeQDSflpTWEW%l`&CW}82bS~>|tqn(gja$FDy;^UfCW~`g%if_{;Wre?dwk#oKgQ+|FOoU~HHEgvH+3 zf^3fz7!*p_%Ikypo>O*^V^d28EcQWIvRj{K8NH2oiBl_A%_-h5i>G)G!(>VQ zhL)t6jH~(vI|n;gPpgZ`QPyhzJMFgfw=J2k;v$>F*5-Zm%XAbv(`80x_*9f&M|WhV z7b+U^@>HTDxgfd0)anZ3xycr7oGWv*KGzcON+yhb6Z`w`4;yTIaM$>5?d{H;*B`L{ z{7>QT{PXdbe%*%SF~KwLE06z4V%}F_?sLzXUsGZKyI(7J*V%Je>2F&_ejHKpoRai& z`bs=%H@vg||M&P;o!qG1*2lp7rdVATm|7HDws2lqRcSP1lyW08F)tbA)-v!dx|20y zhUJ;HB_p$}fkPz|>Mm$|yzU*VboR`P*m{gU3sFfh30sjToz7 z`L)q(yk%`Nzc5+4UzXy2E<-Z?&xWY_-#5j-p?|mjjubpl@F>ACg0+IP1ZkRe@PI~p zSciBpIOEwSdm(8Oo@cuiq8ZaMN^rJ{JD(GLK=2X4p9{+P#3i>{%Q~rYos*1G7|rSK zkhfMi<>%gU90AtlPv`g&MhwNZFg^Q7=4v&Vg`VAvBgDE+ZniY)s2C^BB?`*8c@_In6C)?J=|FHZ~uw2=z=E4xmdrP^gP;9T7g)ki0O}Z4V zn+c|QMYepwYd88pK9`l1(tt{b#rVRBRywh0E?CEU^uDP3Mu zY2%)4)lFk1ja12LbLZB@9qPB=gX;ut9^kMs+Y+RUdGE@AYkyc&(sdwL%T2Jo-A(@J zHfahH{m<%kM%OniQAGng5dZ$Lhzb9bf(Hz@&(7RoQDz&u(xZ6+KrfgTjbtsb`iy)x z;SQ9mqI;bi?fO}a-MlsQkT&J_vf(^kuvzdj!IuP28)fZDDJ2!=#|r6evQ_eLH{tQF zm)I(kNVc$w>SD^C%9^BEP+gYEu&`n6a9TN+V!q-+# zqU>DQx$17xBT(O@C|a?Mf$@z7nQmEpYSgb1yZGgjoabyO(J0|MT!svWo)33)N}3WF zzE`42F(CScF<_8mLs~y-m)t!o-n_nNGNpw#aUHE+Ms@f0)ztDQ2`ux9Sh01&Rr{`z zkor}=LO$8ZIh79SVI*x?*E^T#f2^3Am0KmIB3lvpWZzNX!ACZ?;6$$k?~P+s*X6T}Ig zNPfMaW=kEmdPLT;IQc>}k{gPPunp!(hg{o>>19V9k5>F!oa8*O>N2nH19aqT z?R!5w;J7_0RU}F#Wi7yvp>xgiNWnt|M+-_rM@h7oJhN*<+lSF^@~hZiT7lW@5|=Ej zkdxPDW*QowP`dXXpVR-TrDu=WgFnND^M`R72Xc%pBV5Es8&Z??wqb~X@b-O6J55B+ zY$oJ*mq5Run!x5Voh@uNg!otqhVd-lk|6EeMzHPkqdV#1F^)${3qje79RsWjYdF-?U|6Ma!P-Di?Qok`A=*tcd% zNw<_1AkN|FWQY}AC6jH^S%!y;dBr9kOg5}At>gtx3CxA1T%kzQspQzx(~XXero8%Y z5~CuZ_AO5d=qpkV-xLfDv*q#TELGS^=#|8TZhYYvw?jv}#;7q{_ z1lt5R2!2TL7QwFy{y@;3Yq6>B|Ev4w%72x%9q;DKm3;8o_4mt{EL&E;csZvum)6gn ze7;<2vdXSe)A&ft^xEla{M4Bp=TqrwEvvF8!QB!u&MgxBrr@K3<3C~fiv*43a?gy> zZ9la3vJYFF`G~~@g0~6&MX>I1%Mban#a_X`2)_0cYktyCE$*R)3>`MyjsAlvVDE>B zkxR2-@;qG7Dc$@+jNdgl_Z_I3sz4 zSR_W11`s+}l3EzEE(rrc=$qQJAh)gD@}Mdudoma}%Uc%c}M zD>=&GSr3$p-Fo>(;cohez&I)I!c3dovUVpI&9E!6h`DHDISW~d^O6bf+6yW%FPl<{ z#(17T1-l6x$i3G_+Isyr!8Zlp796^l<@XfaN3ip(cv^MNORiC!ix^RKM!NX3D85m3 zo`om;>AQ9wo_@-yGfta%dL$Z~TR+bqCd;^UR}M>~Ec30RvbBP0 zZtX9I4xPTWBNNvP5w2Zv*i`WWCui=k>4b7$oVmlMF_zD{1#t6~A-zbGYfN6U+woRW zrkfNu^Qbn^-c7yqjkAmHGt|&EGS`siREgfex6AdH6f*f_Lu+GKyoDKw{+LHG6#r?v z;9^mld=-6T^*Wo+otL6u7tNUcRG4IwU3^Tzv>!!Ve6?x0-jFEi@);^ItKvl~<4d=C zYOz?KlITcXO0!ce1HrQ_#SuGuDf-xiOA#g$cA?X(Xzpxm*FTHqCcAY`mrU6AF=s_= z3gx!UJ&P`eqGVh$ zOQlz{hRh3-9F;9v#MKTmAAQNpj_Asa@)@>?OE#EOE~PZl`veM8(L{ekkqWn7)h}^( zMgNSYXo}DO=??}}s^{ryTJpwZa_}*lN|zovI?ZNu;5m_Ef=(ghdk=0c+WA{vi+8-& zK938RoA3VVFtOs0wJ!bkx_t?fK|lWKB`EK8xG)Yyk0@ckDJ2eA;FMr;ySFcb-(Oj^6~m459nvhbs#?0- z_}^ix{(4M_-l>0Q+EjMAe%s;t3f|2(9Ij_>6}+6eLp}EjUd~;I@p4)sTW(@Ay>-!5A@fxV$Kv(8(uecmbTRSMy~@#xtP~ zR+TH?hj!<}9Gc~7{lNgc;l{F%J2zR1Q!p6ryT}gxdaH8z>@c)4=-STjGZjC?TyCxS z>2OpaA4Dx*d35Pf6){Bv=DZz#2~nv`R7!CSJScuNc4z}(3N=dVNbk?1l45Lsi# zJgk>xnGl)xb9YiJ<3pEuM9J}e?|8>3<<>PEn)8y*GyL9H{CB9oxTQbUn$`OX zaPGZChoO{RW3}0#_us?;4;(D!4p+{P@qx??<5QL$J9(AY6+DmLjcXi^G7e-~S_)k$ z-m=}T8_r*cR&SdShI?tggzoX#8atiCpk99jd3Snu?$e>wx9GP+c*%+~ZeD8eyK<<6 z&Y{(J#y9XrDqlou=PReXjDc&n9a{aRd~}zwZoDOx-%SR%cF$qSe;Wr5-xHG@la1=Z zaN}BsCB5W)_su|f=iMs1Y9i~$qW%=v+8HcW4aF$%V>(I@|y?m2n zEV_E;uxZ-VF{1*WIDZ{h$agxgP_bN4?io)mT^#Z)cG*YLL#NRbD+SJ9hnH1YaPf9H zDO7I3=^S2OPVW@{mAm0rRq!s~9P$CQG8-;j4kuL%7~D9|A%_9V9B|`2hoQ-n&j?y@ z{yJoQQ|5o=gIgDJSeg88CXh&2nvfulQ%Ov|Zc zu9xE@33?wT#5mc`W%LleI1yyJz|TBX*hsUN<_0c$Zz)SJ#j7ByesQMwBFOU0GG|&G zH0bRpRzPepmYF`n>{q&OV~zeoVy?IrVs|g=8*GuBmr4>RS3Waq^o!y&g8Fk}`eO@4 z)e^(7qvi-b|DUX11jg~5Rs!@V!*hJ9flstun#^WY{oK^L=*A26t)wP%j3v@xkaF)T zAIjIia9|#v|I*@;lgo7{7BDgi=(49g+h)_)nrS^5p?{(vn^~_v8D7i*=W238o(Y+L z0dV<7y%1p!x|H4u6ayBo*lFWni+KyhS!-*F=B87@XIH;E>h5)%m~Ha{Vx`gCWEFd) zf>Y{~$mUHb8vt>L_o3WtPG#oBmz~N?mvSDmn0A3RD{G0}$>PhYWJ&Q}FOYFaV{X!H zt2zf-bnawULaUHp>MVCD1h#5pQ znx#&wX~-=}H|hzZv(brdV?a^nJKTB`ns-nn423Rw$z-6+N}vNKE)dI|hAN=HQ7bkB zrldI@^VlHgH4IF-y#ZD7?oOd-z( zibBassd&%@vUn(q^wxij%%Yz)96z?rIcM$8IHl6IUXH9Z(-A5&<4s&ng%G$#bMDHy z$-2FbTQMt3?}1Cq^xNv$R12LWlPz6EcAvj|8wk6>{4H}tsViQKYG>4%9seFW-3rk= z^tltQaDSgyckSON|GaD7=g+$}ci}BhTFQt`U6(6msYQd4Ha|V#SUaT9olKy?DjDi@ zUGjGukAvR$_t5FKzixHY{zG^EU4Q?l?7Q$v`ch+7r1cDHVQP&&6t%l{DX}rFm&nS# zi+~#o11`8xo^!F}6TSITPPIl7iDCnw_n!1_&F=iw_JXxVKg*tuYm>UNOF5@WtFFcu zhbh_`wKq@-#Ke^p{b)BUO3suwbzRx|bfMUt(-Ja#sqb*ZN43|mm@ZE0prIC<1fBW2 z#Ycu%{kye)=YQzW?%e;OxVt-)Ts6tb55MRw!cq#7MD9_Kf0mKRdOw6gjx$b}(Own8 zWC$Ao#eQ2GlvQqRKzmR~>fN}2r+kHjHz6uQVhzi!6;Fj5r)_hs?mF70|2;=aJ{)Dy znZH|HBzkB6&xcrd&NL3P41LE|E?ZjM=-E%{frFdQP$P2vagf|vebQH}Xj(Kj&;*#RXlsWl zqiz#;SQKwzF364hMNWNh=c3%`T3&qMQwZWJr^|WuNZVW(U&E_Y+%)FdC$GFdGs*71 z+$;DU!N&xDA^4o&9|Zp__@>~X;GUDMdj|`K1SblfDtLzA*@7zsR|~cart=%k7gIpf z-hrl_1MAI~6}U0g%p@!6g?*OHfcbWG6S!r@MZy;u$srul4W)J`UAomj`K8V5TwdQT zFLdby&2QAL1YlPWxLL}$P(Smc24K=(TauctEtnhzrJcv9R2F%#<1{Ufm2SyOet<5a zO?5|OVWuEk(AI!GWqZR$GB>tsaW|H9`^?UC+Q~Bmg&3Pt7YnA-Yi+qpua$C^UfYn+=YL^LL%?Zuy~x3%E|3dZ7~qzyD&5U2-A>3+s3a&K}ecwe+7`6nC&MDCWAZkKby#_VDXwJ4d7FV-LP(6LB$i0Rx+UcV}3 zLTuliGq++S)y3K1XCC+vPb#nDxR5Dfz&u-j2`puvqyd>oX41~UBoRLy%eSUW?e5sKbhoAZK0n2cyyYCYb&f7&1FbXeo}}KT*AgFRW_|%J$y*F8&^fcY zNqlt=4aK|qj#S{D&$UQY7REc*B;wllNK4B(`WP5>FTHjFd-}<2>Dhc^$F()-wde4v zHgEBW-Bf}S(wNu3*SXG!twCW;xq(hgXHrBxi`Aa%L8kWCNXws0j5JB3G?&l4J1vhZ z^jDyapRx9qwI+$?X`96--97{!^@D9|_+Xc7bl{y?$!IB4zDO?6UJ*uCe6$1d6TyMr zF1=QYk!f2^AuwO(;q837M)SO+wISWkw9~}a^-{WsWLj{~1kx;=()r1=>Hp;3b%FBe z`b>FT(ke?s1WxC3;K?i&2cGpQ32Yg+8}pqu?Q<+k*jroVv<(geirIPmnv}aIR_^vZ z{d0rv!F<9;?9&s-JM$8&T)y(z#fnN6pmc%?bAc|=&T*Cz-R(U4Q&ZYu^9>|tzRY|N z-aSS2fYd!uKzNI~Pz-9+9#gjQ)r)QVXL2Oy8g;EV383FQVP(i#)W6c=?i&mfk-Bbv zn$A(wA$GgnlYWtkrqexY)ULa#XF}p09O)WYL%N4^>8EYGyQEl&Z4bTNv>~RCwzrI+ zT@1K2hZl8XC0lehnsiIHTATFW_J#}-6AGif(?f&OooQbrXKYIIbqe`#SD;S~-hO-GZA1ZxFmq@Gimo1ivHrW5H(xe=qok;Lua0 zyb0C_P82*v@Jzvlf)@(539c9XfZ+9lpAx)B@FBq;3O*_LJHfvQ4w+%YwV&Xzf+q=1 z6FgJ!Y{7E{jgInZWjEQV2|LPg7*uqk6+l5=j91K3s@gtTHsR=>*HqSUks&D zcyyKx?~{VR5p3;TrcWKVcAA5Vpnlxx-W*Bi9X)vaqO2M@+q$>E;NgN}1y2)9=lQ57 zfupg`w?_2Yhg6FWQoHb3XHSN`YxRbTO0TtT=vvc$2HQ1vf1T)V7Q9XH4ndi|$?Q!g zZ*J~ZK6SG*x8n3n74OWvt@vc8Z8B>sP1?jQR5E3AGd4S6bMrMjU9+<_J6Q|N)nuwx znyCdRYQ=e4X`04_OJ-?yl4kzSBnV6cn4%eE5@wJAn46yo8ph4e#7s}l@SYVXiABGp z;~xZH6a2g2+k$)7N&OT&T5zJ^Ou;h+8wAf0yijnBV7p+K;5xx>!S@SZBY1=0ZGvAA z{F>mm1RoLniQtoheS$9vzAE^-;5&jN=h%22EZEkvobBjBTf6>dOdHiN*QH<8WS^Sx z2L}3MBAx8|=vTu6kLCprU53MFSoanQUL@El*ugnbUQTDlhxe)0q}t@p6@Rr=?A;?M z@4KqTf*Ap+C&c_2L3=*8bc%O}n7<(???c&TD`j5E*55obUl`%r)$BA;KDzjV4=28f zs4_cR_A9IUU1gQl(>`8yFfU8+c6BznPO&M>iDzDh)n9gHrCEPYg%OT%yn{D$urF_a zyU#*$K1=D1Yx8}`H7VYLY1gfjInAs$B$@AIlPw88xY^Em2s14%rie+^uzd_~v#2%+ zDt+?HMvemy`DBjsG2^FA?I?_rwN5eBKU`5{_%%tspIMFJ-L9jD&Hey~`<4t<4>6{X<6I*mqzs1paxyfx$3%?=b^|&EN@R(S!SsLl3@r3VJX( z13h?01U(1fegTHS9bg!oz7Rdw3vL1@FG3IQvlu-%X9;@nOQ7Na+V7X52bY|K9z1Rt zda$MuJvabv1utHX9{d;B4_YgVEMcQl~~pIU_;yy_zK z;5)0)^CIx=&FH~DwxS1rycRw9!w&S|NuB7y&x6~*qtfWX8$iVY!e_eBgYzyy4}KYJ z27i`C4>oK-5B>|>2L56rdT{1@&~w1`$@iiMKl(oO;4@dE2fuU`dhpl}p$GqR4SFzh zEqd_w8_^%F)TEoxgRxJd2Ok8R!O=bF!H1>Zvt z?(u!}V8aj4gI@zTf$cv;4<7gkdhmN-KX}Tc=tGppAE5{D1;gOz$I*j3z)j%VAEO8V z0d51w{1iQSBdA6bj-R0iKMjV#lb%2i{vF%|-u-j*;IF}L;6K2AaNJYq$0+p$Fa*wd z8a?r_zn88O8o>3f#E*%;3Hr&c)h3tmMJHvS3yc%{Dj8hY^L zzn};A{~LO6E4T?9|2lf`3*a_z`QOol54?f?c%>r$Ko36kCVFs>f1wB0gPXu<1L(ot zx6y-_zJnfoK)pSvIEZ=mkhcdz-~~h99t?xefz9Ai!`~j<1fDzM?ZK_!xINw;+y)*z z>g~aP@Q0w{MT_-&qX)mR4|;IYzUaZn!A;=p`=bX3z-{2NgV2MQfQplxw}2sV8yE(U zI2b(`12=)4;8yU$!_b3Ig8ksP4o82YQZtT34}Js;gBKiy9=!WF^x*!Z(Syxn(Ssw$ zp$C_O>LjIp1ct!xk4F!F_IUK*ufa`V?Fs0?yTEPW=@Za{%Rx0ssr$eX_%av<51EJ_ zES!iQd<@(Qe))9t;JiBY;Ei+8Pv%|f2zu~-Fbtj zP2l0@p$BgTw}D?fA3fM|A^NGXVw_{Y(MpSlG-IO~(>PgClfJ?O#L zZbc8CcN=8H?x?|@su-+UT9_~Fl>2jjP+pUH32+<_i^;vV$ix_i-sFM^xEL%)h1 zyb9a~{u%5CYwtsUI^(miqX+*4hQaIaM-TQtfFA642)#D{26}K#FM9CiZ=s(>I)Ndu z;oIoJ=fP%hk8S9|4?cz-3_Xq>JnzTo!C^l`Kb!vN=jg#-gJJ#rOZ55~+@znMLJz(L zZUbNZ6?*W?zeZn2Jo?asL!LzsF8(cg@C9%axZyeU;APLF2VegkdhoL^qMxJGslP`L z-Uf!j{LARU-+`OJZ@z*a{M)PO!HMsn2L}hypF#YGyfYXAmkxhtFbvK<_?^LKaQPwc z3~mD71h<0g4t-~E8@L_p2QNJAok4Xb<25h@h7U&%-Ul{=Cmw+w{2aIyJmE<6;J?6r zaOlzK!=x`50#B|%4{imU!6T1B4_;4|P> z@E_ndaODj2;FnHAU(YxP41qglq6fpLqX)aeP2l&yt>DO6=)sG?e(*j}%|i!yaC(_z5s3mPi{aDww;B(fp!B7fp49S9=v2BdTA6LJB=Nd@cIL)aMTL z;Gr4x;NQE@gJ);agFgbdg73|t2j4272OHL-UqX3*KYFnC3iRNkU^Ce90rcQ6u0#*c z{2+R;b~AeLnl0#;((iv5J-F>!^x(%nf*w5jI`m*axE1XBD0;B*W9Y%ZUXT79+N~SW zgU^FuaG#segWJJP;9DO@58izXdhpgypa*aIB>H8vqqm|5$8SXs4*N8E@XF7k2glrw z9=sde2FC704_^2=^o^98yU>Hb{Q`Qh`CjzkYv3lZ;j8GuqwYfwzVvnU;Mw=1U(WdS z0rcQ2U>Hn2h#q_y+ywscA@tzU-$D<54(tc#ejEJ?-gVlBUgLMsYy3WXaKPVwgYC1?gAdO^4_ zi1p~f3E)<6Cb$j!0oV`rgGV&co`O@sO&bOW&j+sqyFh&%VnGeLbeS5m;ea8-_Stjf zbwlj$bJW0fj}5DvhH(?w?|`d@#`fJq>}#%$e+QiqR&S50&TB9BKRK*YU^RU=#v9&_ zm>*IfR`Y!Ehre(^SWWZjn=s$f5LTDqd^PvG;RoQ~@wndu|F1=1b*jhxUd*Q~39Ik! zSKa+S_#LalYW;`+f7TVlKa77m{RZIMTEc2O_tnBzGn6&EL|DCiK!6XVe;xeHLRfX; zPBncK{2lAUD!g}fz8n6f_l4DD=xX{N_=DabR>ykyUihi-F;DsHgU@|9tgiCt2jBr3^kW;k{H27mpkgZ~2jbwRzp=hEe?34Yd%Vf8*w{JP=4c~e-u zp#@dyXAk^WZVs!fJ$x_x=^qcP>pkxG!TS95;={wJRds}_&GhI%vg*06fX z<9{9ep||QDlexJL; z>YpC>2jEBC6Sm)YsgnLR_`4SVJsy1>{LApZ`lH+33%?XrmwNQw@K3_e4dzdv{Pn;e z@fCmh>xI7x-q*kM!T%XP6ioks`vdU%e~s{w4%O1HW>4079`xsL9sI0^!s;1M{F>ko z`UdIi$)9fc4c`tc-Og9@zX$%1ZDI8-58n&_^Y4b${Gj`R`1Qdb@o-o@?Frui{A=)C zv;)=ruNlc)?nhzuOAlWMKkcXf^3eqUW%!fvr<(iS@Gm~)uiriJ9Z!eV;lccwU+TYl z;jj2jSQR|+>w|w2-d8>b;NyM%@>RpQ<7e=DdD6cQ{+VaPYF`iE1pm@+!|Ewd_`2c0 z@f_`wN8bbg&3@9?!}r3U{yTsB(Fgw={0koa0Q~n}^q21%`qkV^VfD3O{nT;cs^MQ9 z{Dkdc74^8^1b^|%VRg3_RB2zj;Sc+xKYx1Q-wU7i=zHP+1b?rG?}NYfm9RS76TSiX z?XMDl4`0K$<(AjN>J|@Q2Y>R8uwtrHHGWO-SHmYf>DLYa>Rv6vuJ`cZ_C;fZiFX#6@avpsz{0?|u z|Jw&2-#emy=FtzpPu(Y?F7xm;`>_@T|6vbb2Y=eW5p|L$eVX9c?B@@EH~drZpYgcg z1HXQMfByBtKM(&QkG>Cn?Ew+>BM(0Sf9in|_8GaV<^TTFPx#3mz7GD#gCgGfNfZ2O z@F#l8cQ<_E(1>?_(gXiT`0G9X_rhO(SVX=yNzZ?Gcqa)t_xd(pV8h`oeh2I4KL684^@OvH;@sEGt zpM`(Fr~cI($owf3@%BG;@IQgS)8l^=d~USAedvZCHzuM^_oPn`{Hn1L750R$7yj1q z5jE7q_rZVagot?Gi@Q+6Pd@uYhQGff{2Y*~F zqGo%-KLCH>+=#04@HL0BhF>31KlOyK4n8q2qWcFXYju9O&|O%7e-WL zaQ>{_;xgl3_*Yl^+ozf%Xg}i-bxtt;R&K}t@LO9V>Mm_oW&G3xzaSA&3p{)`{B`iY z^`Rd4QOSsR{i+v!SZhS}d))7Xe*u1mhaZ4Hvdv$MBVHuA5HLAbw|_^kN@59PhB2S-}khiJ@6lYUqoHx312V#8}OSw?)SmJ z_X_4;9)1A+FCXxiuNpG$k5@+2s~-RB;Ge$AKYnV0-|<0z`_&D9_|?=ePxyM^+c!tl zn;!pr;hR6?FJFD|m%%UgxIX~@*p`U8#>3apNSu3(-~BrHOW>dNgs%yH@wNW)*$uxD zKH*tk=z)LsV-c0~gs&GqdP78Q_3(Z0zq^t0=Lz2c{Ir`Q>UfX7<`~WZ-RvJ<)WJUs zf0#$#1pl{>N7TI@z8n6tpNObyJ$w)Rw4R8n_k_O}ejWT39=;F$pS#cxz@KqzM2+$2 zYmTLS!9VE3`u)b9XKlJkv^@7L!Cis`W81b$@cEeA-C!+rD z(f7cQzjqh&fA|OCpZA2n5B`>~L|8+^LY4k`0Dkm+%>O<5nh^aP{69T>9sKiOr~Z2Q zCiwdMchUaAcfk9`XFc#Y!~6QLUidd3h^U30^3exB_o0ZIr?{%cAO1t|pZ4%Iqd7bG z4aP4X_v_$u-;Ah(gXKfJ#YNMin&7Ycw!i)ChW|8tixyM~Ul087?@&HH?)Sp4{GPx6 z?t}j_{QG?Q4?p#X5p|%){hBcZ>rv+4p77Pde;58t58ni@9`m=K-SAhzuNs2AYVn7E z;YShmaZmVq;V=8Ce|@eG{x0~7J?;;{AM%8MeqS?|`m+nZ4*uAmv;H@wZc6 zJn7S|-G@ISs1J;nElz;uH7yh`XBkD$v`+e~D?SdbGZ}?TjyMI_1>2Lh&Q$6r+_3dK*3t#(N|N3Dc{LS#b_G_pdM2!5{rQ|N34N{Ey+E3Z{?ti%Yi;-SD4&(Z7D!13&+zh!fg@?QUN&n^H>)?O+ zFV_D&y#CF(%LgjfM+4)BZunol&H9)p{d(XJdBko{2 z_lJ7nk31-WaEZI{dR|M26E zh^ohfd?0+?@P9rss@@xne<1yP;L|lx^-JwwmHO2SA2}xKE#H0c*B%@7_74N_V~_Lm zH7txh2tOlTllAg;R~d1AN+k2qu%|S0r)W|M%Ax9{?{-tee0yC_k3O*{Pf9D zHRC`6?eZs(e@*bIGYDVM{XqD-;m-_5%ln4_-vfV0G^)CT@e8C+FZ^|Lqv{pU`b;1E zWsOmFM9}|$egOW4kcG{a*M@yWsoaUx#1k(GS31e1242?%`|L`27R?CJ$c+-*$n&em23+x-hCndeXle zKDsjM-GAzVe+2%E9{+pcvrYc;-3Q+fztN)~fWKf>RE0g^tEpvtdXc~W)xi&49aTqr z^iA-`G)KMbr`_;3!%y?*d*C09N4@78df`uB6ZM`y>VvwDnmclh~U_}6y9_rc%T8C5?UK>}21-v;0l zxv2O2bj>vSuYA-yzpaDM!Ly7~)%_;;kHP!e*KYV3g{XIZzXyITJkzwQ?)So93r{y* zmG6Up0N%U*0skj>x`C?tnv*#{y3QZJI{4Gz6CQmN{3qcXJ>|C>{UjH;y`z7KvAe4U3MfbWH$=izIn)4pBm=j-4Xz@O{UH^JYw3%(ovb$DO+ zdf=yC=I_6H;qQdM%;SF_{OIneTI1md;IDx9mEW3Ec-J1DWzwqUqYi!>e3yrBf}eVM zRNdzpzjVXD_}-}cfJfg0-@YlT{^cn@z3^+^A65H#^nLJM@UuPo0r)Ro;jbSxY`i@W z|8tMN4*siGMpd)N|0ei@u8Mls7rWuV2EW9k?|~os!Kiorr5FBcc;EU`AN))3*LmC@ zfG=DfRjWOG4GqVW@V@ZX!H?bS=bPZO@TYpxuN(ezAM%ecdf*S(Li^;=_rlNqu)luv z!G8t*T2K52;Lp6qudg|c{ZaT{kG>B6l53;t{T{vv{%`P?c=&Gk#7Cm)eh=RRf7EsU z@j);A!|-h$eINYfkNVq(0r8OyHGS}nH_<+L+#i6C-yHRxzpFW&`N_wl-u<;Y_+xH~ zsy}(c*91T66H)K`N!{?beln_V^0bdV@Y8RLsslXX?}d+jDyjxN{`bM3xpf!uhhOyR zsCvw!ubIX9{LlEyZyo#x;l2Go{44OQJ>l<$KkN2gjQ`;;yCdp-Kd~3SZ%qCw*#Im_6uW zKVJvG;gP6%!=rD4Pd`Ta_vBwU{7)YDw{Jc0>we7q(WCE$S3irYU-;q={|ord9)19R zB`W6%5b1Mok5A*ycm=xf4^uV3`9 zU(~_B3V*XF{hHvf_jp3&_4Zj7vq2U3tz8T-&gk1<+llb{2R0%+NetT>xSO~KW0dEz6buEfB4s5 zd*M%d)6e(8e;$65$NvHNiU0K1kD4g`=fCJbhE)$=9sJ6-{rzVX{2$IUd)`BQ__qejNO^M^Y4 zkHh=&w+a3ocyIp?f83~;dc_mJ9_{}=G1cseUoZT{`^D7vJbWMgqyuB>kDmAqz#n!{ zOs)6$Uo)5YcMguJ>qk~kAN^_LP)*GHerXf@uw!HDe2@Fx@GFmtsfRq_>w!Nc6!X4+ z)e9eiKh~q~gI^8*JH5bFrTz`T&s`W(Yd!j!dd|6zh3yiE{mzpc=$f}8x19p zJu&sjKGoeHfd9#dV(QX8s`EATS%3a$OpO>`ov(vmcwh&F~M8&}Lj(-^9OA&ETL3w>IR`=6U`df%*R0 z;Qy}wChJFiW;9+mBCJ8V{6AoS`>dNZeLX7tDEp|U>$ZqXH`)3+!h$+f(1BP}+dq{sMy@PA zG1A)5P^yq%cr-ucf7W}>78-jZrW5aux;PHYp1m_8!E7&TyPVg$hn*{F^ykGEP z!KVd(FZhPw9>D<1ZxXyy@P5IE1)moDz2F;ydmJbJ3mz{x zLvWtpxq_{N>jbY7yh-p*!TSXt7JORp_kwQ-?hz9I1&jbY7yh-p*!TSXt7JORp_kwQ-?lDIE z7d&2YhTuHGa|K%k*9l%Fs4A{_9E16>*sRcm6>AFVd?9p7?eyA{Cr>Mwr$4 z#W+E%6`_v1q2{EOb?=kXKe=(kXwkdpqEK!|8@+zeVbWdm>V_q&bNNIny_z4nv7O`x zF&@f40&T`UL$-3uCYy4hcZiW1I%MQ}4MX?TW1peJ_q<-i$UXIL?a(26Y&6`6@_SbG1%igp4DggH&mU?-;qO3&<0#n))Z15 z3HvuOrL7~ire*TUwKLyy^3!Q|8^+T{|liUa^R5h`yIUZ zu>FqS@4z7k4LN|Z<_(*I5}Rw?a8Pg?k$X~mB%w;AuuO_9^y1~OG=thp-ZRW2ibIVNm)m;N7>cFd)H zjkE&BQs7UedoJ0wiryvK@gBXZ&28+=$Jc=Qti^VBM;wybE>)Z6$Cqm((T2(Sc$=zi zOBZU}=XUxHL&L^=gBTn!%sdw7v104q%;BBh z&GR1>{Q?;n=yd=ccjv#GZ^tmxL3DbzZg9Z<7;?FF0{dj$aQ7N@&#LF>PVeUBa}Tn% z9=1>nzq9A?e0V+Qch7F#e}L{KxSGvhIu20Vap4zZbLL5>rPI50hAz=B5Q~x=MZJsv zCGbJLTeo;n^lqI)>-G4=`S0|XVW!hnhfiOwJ-WKaK0AB%$@=B)HLl}dQ19BIt)k!I z0xlv~ZrqyQ`zrL;jR_l@*Nritt~MWSxA*$5(>W78R15m=+Rq~%vIW=f5+$ zM)WTI-RLVU`gg8!HZ6wAAI&>S+W(?HJlEI=hpkWgw-JL^rT?FW4C)_UX7!IQvo?pH z6;zk<&zasMdK+8LncbQ&)SI_jePw#N{CE2MD)b{|ooM83?@s^C3jGnHKSK1C{#8D2 zL$Ax83%^^Z3W*KAqmhOOH0S6{qi)b-w;j+3-92+6{fVXNNzwi_D-|-on{yRQn{den&A}{*yo}cALhsAjl`mEIt|E$%|{EV|{F;xDje#f&U zQ5oa(i=4y4R@!~Vqi?>``hQ)St2@`fe|hvfL_fYlU+MoS3@XjE+- zmQp@m3f6QS@D5^EZ(P5iyXR{D zhbP&F|H3&zSF6Xh+(zkX7@?avG+Z)}yJ57pZk!V&hY^wuL&HHMb3cq$-;GOxLp9j^W|SV`!5Smh!rYavPHu<%zq-x^KCY_T|EC466|9tp zKzRmGL6I_w^G1@;3Sz$9yG~>nMof!G@xPy#PX1biUdSKF9`U83nCFw z;eranMFfE$k6RVA-ajZ+(f{wa)^8^>yUqT5GBf8pYt~u&wf5TkoSdD^O&SfTz z`>n(~#KZW+dqgQeCVrsg_Y{9rJlM%+E|~s%T>tHopC>*p-XP9rD43n%L4QuX;RmiK zaE?!u?+_1qP7ogz5BBpON6L>!db-7vdtHCfGbr959?rW;yhD7A?Ei%Lgm^gbx}fKW zu0JRFOM{+>e^Go)ob|`_)xhsldE%Jq7V%|2avsY6d*Y+w4JM7}*#te}t>QlupNRB4 zDxTc$`cs-8^O*rG&)j3qgPz}skBT2D{k+G|>Q_9J=j-APzmk5*za`!g@&7>3K|N#Q zyLq^gY%f0kWW7DRi6_5yJ}UkDijRs1d)^=Ph&M>SNqi!bKTLeiQ?5Uh|03~J#E%#6 z5D)r4B0ee}%Ckd!JkrxIJ`wSn z_-DmCB7T|psCdZNm&C^+exvw!q~})giAetY;>io`b>()SctgY=6wgKcG4YOwKP^5Q z@fXF%BL1rQc*NfjpNROs#FO8(*Ol|z;78f78^lAo%@NN6h??Jy zct(6&Jot^n#WzOsi^b=>==KLYmx|}aL;G1F-Vw=nijPL}XNZqQydpjx={ZMyBI2JG zPhP4o=S##J#Do1;iRZ-o)c(iBZ;#};%)s)Ti1dG3JbBsA+bTWx1pVTnd>#<*h~$4R zJ|-Ue?~~#a;-S8t7jJl_KEE5pbK)Vte*tHl%>6H!7*8|(OPu>=GWFXlt~Fp;fb!h$ zl4;0Zu{JHfp*?5h1Be@#b`j_PluV7{?-A#|luT#ZEAA}?=RBfA^9Xxp5WZU=K6+!f zNsenlahZ7TKb_B!o{t4R;&+J;7)Ss5eSP_G?=_yc;TG4^Ao+EY?~r`Zf2HJek`Mew z@GZ?Fz9l`QfAI5$^1oAjOgyFYhH~S+j!bd6aX&|t9)&IwLZUZNIrGD%ZGB< z3iZkIUnU;Pa|iK`NPZvV+b7FjtJi<9#Z;gm{CshAF?X+Z{P0p&f>H%l#9XLc0y^llvYrh4%S#(?2&EQ~ic^_)Oq; zs2!r6G5ubA_|E$F_BYwN@pUhUSuUPzgNw0jhwCIC_)g;M#Y6kt*ZB5H#~ZFECq0Kq zeoXR#A1*!-={ZI`xy$Vg<$sFwPe^~L_g=~8Bp>()_?FuFC!}Zeul4o5PJArlmx_-^ zJota^SI89CBlkIE3ibF!=%GL1{)kLkj!r`Ta^F9uP`}sPdFLjh%GWac7XSYwJ|TX) z#*ur)$L{uW%SrxW@GX_Y6X3Lm`vEfDVy{!<9rpob3igNma{oW3klz=jhx`69-EOaV zj?Oga{Wm!MOtPuI{AbN_-XPu}Jv)f!A|A?(`}Hw}atnT&`}8q=-Cn2i#r^r1;(T#m zJf@JZ-R-<{lL?h)DE|Y+bN8s6<>#~FqxaUg+l8`!^zWYE20II$(@;q0(A>yIjxKAEaD7OnB&-TFm?U*X|ivO2|{~+hSc1&lAUn+U- zXUFtQ@oUAoj~x@Q%QM{}&i(6{F1A6pTK9}(w%bWAtcEB5yUr(c>-xrMms z74hUgFaL%a{)5-W8^)c_k)D}v-*P#>4cz7hZ`GIQ9Px4S2I-kAJ`u_9C!YMPUe7_| z4H3_X=fs2lFfMRkHl}`iof=2D9~x6=x1oNy&lyvw-_S3(KN?f$7a_jlzEwOz$ zdej}0FMzY%az7cSlcfK8aqdIIloh{Ke5~O7X7PK(xvve=guUYbc*MCM4$~&_UxTxK zjw@eiewJPqpAc^q|Eu(HUmK>g#JAqo?dN_cOs|UXAkKYKn8JAv5a<3UOuNspx8y_O z-1mg(0LRI4aqbtxbd?J3G;!|Z!t`0`=@IAtElg$cGsU?t4AaN#HAy}$&i!VXmP-C& zaqct2^y97UE%~xI_YYwjll(Wuxo-zk81KF-&ixjcUa(g@KS7-PG%#H*{%djWFTrFt zCFA`Caqi2&v`*#lw;=zY&X1X4UnjG-^LpVv6ih#r{d4e>+8 zx!(iR&+HY?e-83Lac+A7;Jc;beEvSu)jIDf;9Kf1o#6Ci9dGk~7siV-#784uk$yfO zpXqdao$@n$?mbiRGa;Vg^Xi#GJQMsCp99a-Z?D+bXKODvKA)W__Dg*3I#cjV=bD|E zhu-h~`mP!Fb#jsT#E+fdj(CFU8u77*oge8qxk)^E#CcBqd&V*UefvTqp+Eju@;S)| z{+Q&)B;O%D&r5z(@`1kwzNLD3Gw9jY&l~Dx#yh;eCd3bv{%yq@wsZNwcM|UqZ;&%F`aH-E1p+^`X}de*_lE+JVNq(UNuv&e~CDsL(LTIUuNZi zxI*=~#=eC=1K(0T_L)4c`)prdk7tUHi--C;OFWrVUyq?Y`P|@IdqVm1dB04-{!q?* zPA^kj&U`*EQz++8+Ig{F@$+uuvu4^`a;f;}FP+a3zfOGpW8yBJ+$ugMo)W(Yd`so? zfXO4y-^ueE+TqW|8zTOscrN14i+4nPgZOB~{~|sX@xP0YM|`W<>UR-;hj?n|di&oc z-XR|9cW?1A@dlO80pjD4o|O26cqq>{@rHN#d0VAtfp~{_kUvIzEaE4MKPn!||8((< z5$_Ri*u~Eq^q0h!i3dGv#786f^Tfx+gZ&qZC%e|`zg#>QaqhLv@oO~VUkm!hgZ^&? z{kysTQ2uv{H;4!O$HjAz{6pd$;-P+jB|aAMXT&EW{*rjZT(>9ac`fLV_+Nv5@lgK% z4*DbcS?~1nY1qA9{|@3E;z7^u;$xBg{^Ao6|A6?MJzRe%w`TEF#E%eP7V#zG!x3L5 zzCPloh~FOZF7ZbrzEV8dv%Vav;wkZ9|GDDJB7TARaKt|^zCPkti{Bpc>%||9_&3Ej zM*KVCbM~q)XYQrW_MeLQPsEo+{1@V*;-UTjYil1L`CM0~Fpm61oX=BZ3ghgrp@-us zpX1AfLrY;DfX`253ggQL$@96POrM!yZ^>W8`Mgf1PdZNiCC=wqG6g+hT;ua6nZmdh z)&cljNv0d@HA%wy1D^-U6t6$gNM_euWu{~Wr@UM%nZ;&3@^Ih?A z@dokx#U~>9M~!cvY&=wUO8z;?C;Qgxe^tCeJowMQi+6~J^Uj*%{U!H7*B|6}F+MjL zjr6=*d|W*E$+Yy0N)HY#Op6uuLrzC%xaa>Q4o(AzVB%hOf;A*LlAnm=pOF0Rk^F@C zc*I|op5#MrCk`#WDfveu`K@=@ay+>`IQuD|55~08Uh%v(aXuG}X;3^R&gX$K-7kJP zxb;V!HzmGEyy4wmZtK)9j+P!iH;n0Pl3yXt=Y=uZGsEzHhB%)S#$?Y5!~3W>pAW`# zgX-}jaXuG}=?U?x#Q8ihraSC4Nyfza95AM^j`2-#KL3l!o&kpUyTtk2FD85T7v3Kb z=kvap?3rJ9|Ajc8^TlM(`ojAw;(WdrlRe`L?|&BObG?}C*w`Uh{ z=9kY;W%`S~;(5v9FOB7l@H#QmA>x0_&bQ+W?G^hM8rMP1+v$?${vb>@>AOC0KDU?2 zp52T0HR61pIMcW773-1H=wB~+?(faChvdh^xo->8-s)f94f=oR@&(D?ALN_GCI2gN z?$5)N6Ms>h`@S(A~NIQO|?dQ$vQ@Es6OCR+E?vRQJJ$xCU?+v(HrGpFI7GCn&QIL__4 zPP(oTZ@8=7$V~AY#kn5}Q&@+;O`OlkXA1G#y~YjIy*v)i{ykh8zj7w|l;pR0m)8rQYt8gU@tws_n(O&pC4LY%?b#UV&q$v8>oOfA`T649 zH-stV_rubYGXXnedX}MSWH;8keB&PlC75i>Te_zxu z{waCx%gFSw^vv1S?O74ovnx33h5IBig?_Z3A|P6B^&&)cDvhJ=|}MDU6S2iF2PQruW$^_GOozS&{vhNdBJ} z=S=cU$zLtb=Vda5a{j7#%k25a4^n>bkp7OSJnxo#-)CL^P5Tw*j&$PE>#%^A2!%=>>1!w*C7IG#S>SZo?ga5Sd^}uQP zVba6r$usf)g_w>q?w@O4KL*ZvY>4ddl^*W9%oO6Tk!kd-ll<&GUB04|d`+DD<1sCe zJ@jeYUz1docj+meO=|e$+)4qm+j_yIX^hxio@uz!GYspl#SL~A` z&gYdgy;uJB8FB7o#1!)TM{(|t%XEXi;`+RC9n`$Nb9a{i=KtTiv+>!s4+q6A~ipTts&zzk+s<;c0pQWXe=ROxq->_HgDUXz^k4pYQ(}w30iyxV; zpTGPJ98;dn(k~^yERuiPBqR=DpQC*cM<>M$$s9m>|2x{ILoIaI`2I3r{>k?w<+k~kTVUzpDYmPKDtc5k)0ow zp1w%`sgmcuQ%tAWE7noOxnB`e@bjz1xlbn3E%u6enQpN^*trRu1SH$^TZ>HJyiuE6H?zheq=BL~3<^AI3ZJd8Y zdgccH3+HEuzh9jDo-WC zkMY^I&l4qo;^N7H;=h!C`)~0!aN2)!bl#lgmv-k&^7mR;KVF>Axo3iVw6wyw4r<;8 zr2qCve}(dhAI7Ce>XWmif6Whbrsd0OKNpH~|6Zn0zn6<&v%u>yl;;gWkNifs9(SiW z_X%YR^WUF>vmEY;QMVMzyFea!<#OD z@eKdL>;~^&FKq8T%tVXqUa`MLgP-@2 z-?@C4*MH2oglgUfB;Roq~|&DiHQF%IQ7q*<@!T>^@hn$Js(D4 zd$RSuF3J^PsaY}?0^zY6oaCUNdh!W7n3=8HGH&(FKN&U=zL_k(2GSG-sJXCHMQ=2K@I zH_^J6&r5#i1ulQiO#k}J;@r=cDZ~l4iob0ywphI)OO3ls?Q5Up zx!)I)?fHfGig@x+y`E2rbAL9b&>yc5w|(XKh3xs7_{_Z9xrgk((>Mj|)5DT~`MI2Z z@jv?dX>it8LsXu>ll(Tfx_po1|0KSf`e|tAo5Z=lCewAYXY2QPy>MSPrWeI`6#rY! z%OR}4?JvGU{WPp^H;HrqbEe0nXTJEGce z{~uGRuYXED73taLyb!HonXmOx|J_gW++ULEVcCDMas9aFEhl;Ihst!2 z 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 N+40IG%iO%i{|5%DdDs8| diff --git a/tools/nimweb.nim b/tools/nimweb.nim index 4835c5f4f..81602549c 100644 --- a/tools/nimweb.nim +++ b/tools/nimweb.nim @@ -80,7 +80,7 @@ proc parseCmdLine(c: var TConfigData) = proc walkDirRecursively(s: var seq[string], root, ext: string) = for k, f in walkDir(root): case k - of pcFile, pcLinkToFile: + of pcFile, pcLinkToFile: if cmpIgnoreCase(ext, extractFileExt(f)) == 0: add(s, f) of pcDirectory: walkDirRecursively(s, f, ext) @@ -122,21 +122,21 @@ proc parseIniFile(c: var TConfigData) = of "authors": c.authors = v else: quit(errorStr(p, "unknown variable: " & k.key)) of "var": nil - of "links": add(c.links, (key: k.key, val: v)) - of "tabs": add(c.tabs, (key: k.key, val: v)) + of "links": add(c.links, (k.key, v)) + of "tabs": add(c.tabs, (k.key, v)) of "ticker": c.ticker = v - of "documentation": + of "documentation": case normalize(k.key) - of "doc": addFiles(c.doc, "doc", "txt" splitSeq(v, {';'})) - of "srcdoc": addFiles(c.srcdoc, "lib", "nim", splitSeq(v, {';'})) - of "webdoc": addFiles(c.webdoc, "lib", "nim", splitSeq(v, {';'})) + of "doc": addFiles(c.doc, "doc", ".txt", splitSeq(v, {';'})) + of "srcdoc": addFiles(c.srcdoc, "lib", ".nim", splitSeq(v, {';'})) + of "webdoc": addFiles(c.webdoc, "lib", ".nim", splitSeq(v, {';'})) else: quit(errorStr(p, "unknown variable: " & k.key)) else: nil of cfgOption: quit(errorStr(p, "syntax error")) of cfgError: quit(errorStr(p, k.msg)) close(p) - if c.projectName.len == 0: + if c.projectName.len == 0: c.projectName = changeFileExt(extractFilename(c.infile), "") if c.outdir.len == 0: c.outdir = extractDir(c.infile) @@ -145,33 +145,33 @@ proc parseIniFile(c: var TConfigData) = # ------------------- main ---------------------------------------------------- -proc Exec(cmd: string) = +proc Exec(cmd: string) = echo(cmd) if os.executeShellCommand(cmd) != 0: quit("external program failed") proc buildDoc(c: var TConfigData, destPath: string) = # call nim for the documentation: for d in items(c.doc): - Exec("nimrod rst2html $1 -o:$2 --index=$3/theindex $4" % - [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), - destpath, d]) - for d in items(c.srcdoc): - Exec("nimrod doc $1 -o:$2 --index=$3/theindex $4" % + Exec("nimrod rst2html $1 -o:$2 --index=$3/theindex $4" % [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), destpath, d]) - Exec("nimrod rst2html $1 -o:$2/theindex.html $2/theindex" % + for d in items(c.srcdoc): + Exec("nimrod doc $1 -o:$2 --index=$3/theindex $4" % + [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), + destpath, d]) + Exec("nimrod rst2html $1 -o:$2/theindex.html $2/theindex" % [c.nimrodArgs, destPath]) -proc buildAddDoc(c: var TConfigData, destPath: string) = +proc buildAddDoc(c: var TConfigData, destPath: string) = # build additional documentation (without the index): for d in items(c.webdoc): - Exec("nimrod doc $1 -o:$2 $3" % + Exec("nimrod doc $1 -o:$2 $3" % [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), d]) -proc main(c: var TConfigData) = +proc main(c: var TConfigData) = const cmd = "nimrod rst2html --compileonly $1 -o:web/$2.temp web/$2.txt" - if c.ticker.len > 0: + if c.ticker.len > 0: Exec(cmd % [c.nimrodArgs, c.ticker]) var temp = "web" / changeFileExt(c.ticker, "temp") c.ticker = readFile(temp) @@ -191,7 +191,7 @@ proc main(c: var TConfigData) = else: quit("[Error] cannot write file: " & outfile) removeFile(temp) - + buildAddDoc(c, "web/upload") buildDoc(c, "web/upload") buildDoc(c, "doc")