From 0035c5e9adc9e52b49291de435a954f8ce4901a6 Mon Sep 17 00:00:00 2001 From: Lua Team Date: Tue, 1 Jul 1997 14:48:56 +0000 Subject: [PATCH] Imported from ../lua-3.0.tar.gz. --- COPYRIGHT | 2 +- HISTORY | 16 +- INSTALL | 41 +- Makefile | 4 - README | 32 +- clients/lib/iolib.c | 167 +- clients/lib/{old => }/mathlib.c | 83 +- clients/lib/old/Makefile | 35 - clients/lib/old/iolib.c | 618 --- clients/lib/old/strlib.c | 276 -- clients/lib/strlib.c | 250 +- clients/lua/lua.c | 76 +- config | 10 +- doc/Makefile | 23 - doc/idx.html | 241 + doc/index.html | 85 + doc/luac.html | 88 + doc/luac.man | 75 - doc/luac.ps | 246 -- doc/luac.txt | 66 - doc/manual.html | 2545 +++++++++++ doc/refman.ps | 7807 --------------------------------- include/Makefile | 2 +- include/auxlib.h | 30 + include/lua.h | 123 +- {clients/lib/old => include}/lualib.h | 16 +- src/Makefile | 18 +- src/auxlib.c | 81 + src/auxlib.h | 30 + src/fallback.c | 395 +- src/fallback.h | 102 +- src/func.c | 42 +- src/func.h | 5 +- src/hash.c | 281 +- src/hash.h | 33 +- src/inout.c | 708 +-- src/inout.h | 59 +- src/lex.c | 219 +- src/lex.h | 7 +- src/lua.stx | 63 +- src/luac/dump.c | 30 +- src/luac/luac.c | 139 +- src/luac/luac.h | 11 +- src/luac/print.c | 233 +- src/luac/print.h | 9 +- src/luamem.c | 159 + src/{mem.h => luamem.h} | 6 +- src/mem.c | 58 - src/opcode.c | 886 ++-- src/opcode.h | 71 +- src/parser.c | 660 +-- src/table.c | 180 +- src/table.h | 11 +- src/tree.c | 118 +- src/tree.h | 18 +- src/undump.c | 145 +- src/undump.h | 15 +- src/zio.c | 79 + src/zio.h | 48 + test/README | 7 +- test/array.lua | 6 +- test/bisect.lua | 4 +- test/dump.lua | 26 +- test/examples/complex/complex.lua | 82 - test/examples/complex/mandel.lua | 25 - test/examples/www/README | 10 + test/examples/www/db.lua | 46 + test/examples/www/staff.lua | 37 + test/examples/www/template.html | 29 + test/hello.lua | 2 +- test/loop.lua | 6 - test/lua | 0 test/luac | 0 test/sort.lua | 2 +- test/split.lua | 18 - test/type.lua | 37 - 76 files changed, 6731 insertions(+), 11482 deletions(-) rename clients/lib/{old => }/mathlib.c (57%) delete mode 100644 clients/lib/old/Makefile delete mode 100644 clients/lib/old/iolib.c delete mode 100644 clients/lib/old/strlib.c delete mode 100644 doc/Makefile create mode 100644 doc/idx.html create mode 100644 doc/index.html create mode 100644 doc/luac.html delete mode 100644 doc/luac.man delete mode 100644 doc/luac.ps delete mode 100644 doc/luac.txt create mode 100644 doc/manual.html delete mode 100644 doc/refman.ps create mode 100644 include/auxlib.h rename {clients/lib/old => include}/lualib.h (53%) create mode 100644 src/auxlib.c create mode 100644 src/auxlib.h rewrite src/fallback.h (77%) rewrite src/inout.c (66%) rewrite src/inout.h (74%) create mode 100644 src/luamem.c rename src/{mem.h => luamem.h} (91%) delete mode 100644 src/mem.c create mode 100644 src/zio.c create mode 100644 src/zio.h delete mode 100644 test/examples/complex/complex.lua delete mode 100644 test/examples/complex/mandel.lua create mode 100644 test/examples/www/README create mode 100644 test/examples/www/db.lua create mode 100644 test/examples/www/staff.lua create mode 100644 test/examples/www/template.html delete mode 100644 test/loop.lua create mode 100755 test/lua create mode 100755 test/luac delete mode 100644 test/split.lua delete mode 100644 test/type.lua diff --git a/COPYRIGHT b/COPYRIGHT index 5ca877a..f84898d 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,4 +1,4 @@ -Copyright (c) 1994-1996 TeCGraf, PUC-Rio. Written by Waldemar Celes Filho, +Copyright (c) 1994-1997 TeCGraf, PUC-Rio. Written by Waldemar Celes Filho, Roberto Ierusalimschy, Luiz Henrique de Figueiredo. All rights reserved. Permission is hereby granted, without written agreement and without license or diff --git a/HISTORY b/HISTORY index 3f1e5d6..1db2df2 100644 --- a/HISTORY +++ b/HISTORY @@ -1,4 +1,18 @@ -Current version is 2.5 +This is version 3.0. + +* Changes since version 2.5 (no versions between 2.5 and 3.0) + + NEW CONCEPT: "tag methods". + Tag methods replace fallbacks as the meta-mechanism for extending the + semantics of Lua. Whereas fallbacks had a global nature, tag methods + work on objects having the same tag (e.g., groups of tables). + Existing code that uses fallbacks should work without change. + + new, general syntax for constructors {[exp] = exp, ... }. + + support for handling variable number of arguments in functions (varargs). + + support for conditional compilation ($if ... $else ... $end). + + cleaner semantics in API simplifies host code. + + better support for writing libraries (auxlib.h). + + better type checking and error messages in the standard library. + + luac can now also undump. * Changes since version 2.4 + io and string libraries are now based on pattern matching; diff --git a/INSTALL b/INSTALL index 3d34379..5a349d7 100644 --- a/INSTALL +++ b/INSTALL @@ -1,26 +1,53 @@ * Installation - Installing Lua should be very easy: + + Building Lua on a Unix system should be very easy: 1. Edit "config" to suit your platform, if at all necessary 2. Then, type "make" + See below for instructions for Windows and Macintosh. + * What you get + If make succeeds, you get: - * a compiler and an interpreter in ./bin/lua; + * an interpreter and a compiler in ./bin; * libraries in ./lib; * include files in ./include. + These are the only directories you need for development. - There is a reference manual in ./doc, and tests and examples in ./test. + There is a reference manual in html in ./doc, and sample code in ./test. You don't need these directories for development. * If you have problems (and solutions!) - If make fails, please let us know (lua@icad.puc-rio.br). + + If "make" fails, please let us know (lua@tecgraf.puc-rio.br). If you make changes to "config", please send them to us. * Shared libraries + If you are running SunOs 4.x, type the following after "make" succeeds: - ld -o lib/liblua.so.2.5 src/*.o - ld -o lib/liblualib.so.2.5 clients/lib/*.o + ld -o lib/liblua.so.3.0 src/*.o + ld -o lib/liblualib.so.3.0 clients/lib/*.o For AIX, the OpenGL clone Mesa includes a script for making shared libraries. - For other systems, please let us know how! + For other systems, please tell us how! + +* Installation on Windows or Macintosh + + The instructions for building Lua on a Mac or Windows machine depend on + the particular compiler you are using. + The simplest way is to create a folder with all .c and .h files. + Then create projects for the basic library, the standard library, + the interpreter and the compiler, as follows: + + basic lib: auxlib.c fallback.c func.c hash.c inout.c lex.c luamem.c + opcode.c parser.c table.c tree.c undump.c zio.c + + standard lib: iolib.c mathlib.c strlib.c + + interpreter: basic lib, standard lib, lua.c + + compiler: basic lib, dump.c luac.c print.c + + Of course, to use Lua as a library, you'll have to know how to create + libraries and use with your compiler. diff --git a/Makefile b/Makefile index 6015326..c1c09f5 100644 --- a/Makefile +++ b/Makefile @@ -5,8 +5,4 @@ all co clean klean: cd src; make $@ cd src/luac; make $@ cd clients/lib; make $@ - cd clients/lib/old; make $@ cd clients/lua; make $@ - -old: - cd clients/lib/old; make $@ diff --git a/README b/README index 1f124d6..b5d9b43 100644 --- a/README +++ b/README @@ -5,32 +5,32 @@ Dozens of industrial products developed by TeCGraf use Lua. * Some features of Lua - + a simple, pascal-like, syntax - + powerful data description constructs (e.g., associative arrays) - + user-controlled type constructors - + fallbacks for extending the language in unconventional ways (e.g., - inheritance, overloading) - + garbage collection - + Lua programs are compiled into bytecodes, which are then interpreted - + portable, written in ANSI C (runs in Unix, DOS, Windows, Mac, Cray, ...) + + simple syntax (Pascal-like); + + powerful data description constructs (e.g., associative arrays); + + user-controlled type constructors; + + extensible semantics with tag methods; + + garbage collection; + + Lua programs are compiled into bytecodes, which are then interpreted; + + truly portable, written in ANSI C. * Availability The latest version of Lua is always available at the following locations: - In Brazil: ftp://ftp.icad.puc-rio.br/pub/lua/lua.tar.gz - In Canada: ftp://csg.uwaterloo.ca/pub/lhf/lua/lua.tar.gz - In Germany: ftp://ftp.uni-trier.de/pub/languages/lua/lua.tar.gz - In Greece: ftp://ftp.ntua.gr/pub/lang/lua/lua.tar.gz - Home page: http://www.inf.puc-rio.br/~roberto/lua.html - The current version is 2.5. + In Brazil: ftp://ftp.icad.puc-rio.br/pub/lua/lua.tar.gz + In Canada: ftp://csg.uwaterloo.ca/pub/lhf/lua/lua.tar.gz + In Germany: ftp://ftp.uni-trier.de/pub/languages/lua/lua.tar.gz + In Greece: ftp://ftp.ntua.gr/pub/lang/lua/lua.tar.gz + Home page: http://www.tecgraf.puc-rio.br/lua/ + Meta page: http://www.tecgraf.puc-rio.br/lua/meta.html + The current version is 3.0 * Legal matters Lua is freely available for both academic and commercial purposes. - Lua is not in the public domain; TeCGraf keeps its copyright. See COPYRIGHT. * Installation See INSTALL. * Contacting the authors - Send your comments, bug reports and anything else to lua@icad.puc-rio.br. + Send your comments, bug reports and anything else to lua@tecgraf.puc-rio.br. Please send us email if you download Lua so that we can know how far it goes. + For reporting bugs, try also the mailing list: lua-l@tecgraf.puc-rio.br diff --git a/clients/lib/iolib.c b/clients/lib/iolib.c index c2faf1c..e518df1 100644 --- a/clients/lib/iolib.c +++ b/clients/lib/iolib.c @@ -1,16 +1,16 @@ #include -#include #include #include #include #include #include "lua.h" +#include "auxlib.h" #include "luadebug.h" #include "lualib.h" -FILE *lua_infile, *lua_outfile; +int lua_tagio; #ifdef POPEN @@ -31,76 +31,95 @@ static void pushresult (int i) #ifndef NOSTRERROR lua_pushstring(strerror(errno)); #else - lua_pushstring("system unable to define the error"); + lua_pushstring("O.S. unable to define the error"); #endif } } -static void closefile (FILE *f) + +static FILE *getfile (char *name) +{ + lua_Object f = lua_getglobal(name); + if (!lua_isuserdata(f) || lua_tag(f) != lua_tagio) + luaL_verror("global variable %s is not a file handle", name); + return lua_getuserdata(f); +} + + +static void closefile (char *name) { - if (f == stdin || f == stdout) - return; - if (f == lua_infile) - lua_infile = stdin; - if (f == lua_outfile) - lua_outfile = stdout; + FILE *f = getfile(name); + if (f == stdin || f == stdout) return; if (pclose(f) == -1) fclose(f); } +static void setfile (FILE *f, char *name) +{ + lua_pushusertag(f, lua_tagio); + lua_setglobal(name); +} + + +static void setreturn (FILE *f, char *name) +{ + setfile(f, name); + lua_pushusertag(f, lua_tagio); +} + static void io_readfrom (void) { + FILE *current; lua_Object f = lua_getparam(1); - if (f == LUA_NOOBJECT) - closefile(lua_infile); /* restore standart input */ - else if (lua_isuserdata(f)) - lua_infile = lua_getuserdata(f); + if (f == LUA_NOOBJECT) { + closefile("_INPUT"); + current = stdin; + } + else if (lua_tag(f) == lua_tagio) + current = lua_getuserdata(f); else { - char *s = lua_check_string(1, "readfrom"); - FILE *fp = (*s == '|') ? popen(s+1, "r") : fopen(s, "r"); - if (fp) - lua_infile = fp; - else { + char *s = luaL_check_string(1); + current = (*s == '|') ? popen(s+1, "r") : fopen(s, "r"); + if (current == NULL) { pushresult(0); return; } } - lua_pushuserdata(lua_infile); + setreturn(current, "_INPUT"); } static void io_writeto (void) { + FILE *current; lua_Object f = lua_getparam(1); - if (f == LUA_NOOBJECT) - closefile(lua_outfile); /* restore standart output */ - else if (lua_isuserdata(f)) - lua_outfile = lua_getuserdata(f); + if (f == LUA_NOOBJECT) { + closefile("_OUTPUT"); + current = stdout; + } + else if (lua_tag(f) == lua_tagio) + current = lua_getuserdata(f); else { - char *s = lua_check_string(1, "writeto"); - FILE *fp = (*s == '|') ? popen(s+1,"w") : fopen(s,"w"); - if (fp) - lua_outfile = fp; - else { + char *s = luaL_check_string(1); + current = (*s == '|') ? popen(s+1,"w") : fopen(s,"w"); + if (current == NULL) { pushresult(0); return; } } - lua_pushuserdata(lua_outfile); + setreturn(current, "_OUTPUT"); } static void io_appendto (void) { - char *s = lua_check_string(1, "appendto"); + char *s = luaL_check_string(1); FILE *fp = fopen (s, "a"); - if (fp != NULL) { - lua_outfile = fp; - lua_pushuserdata(lua_outfile); - } + if (fp != NULL) + setreturn(fp, "_OUTPUT"); else pushresult(0); } @@ -110,23 +129,30 @@ static void io_appendto (void) static void io_read (void) { + FILE *f = getfile("_INPUT"); char *buff; - char *p = lua_opt_string(1, "[^\n]*{\n}", "read"); + char *p = luaL_opt_string(1, "[^\n]*{\n}"); int inskip = 0; /* to control {skips} */ int c = NEED_OTHER; - luaI_addchar(0); + luaI_emptybuff(); while (*p) { - if (*p == '{' || *p == '}') { - inskip = (*p == '{'); + if (*p == '{') { + inskip++; + p++; + } + else if (*p == '}') { + if (inskip == 0) + lua_error("unbalanced braces in read pattern"); + inskip--; p++; } else { - char *ep = item_end(p); /* get what is next */ + char *ep = luaL_item_end(p); /* get what is next */ int m; /* match result */ - if (c == NEED_OTHER) c = getc(lua_infile); - m = (c == EOF) ? 0 : singlematch((char)c, p); + if (c == NEED_OTHER) c = getc(f); + m = (c == EOF) ? 0 : luaL_singlematch((char)c, p); if (m) { - if (!inskip) luaI_addchar(c); + if (inskip == 0) luaI_addchar(c); c = NEED_OTHER; } switch (*ep) { @@ -144,7 +170,7 @@ static void io_read (void) } } break_while: if (c >= 0) /* not EOF nor NEED_OTHER? */ - ungetc(c, lua_infile); + ungetc(c, f); buff = luaI_addchar(0); if (*buff != 0 || *p == 0) /* read something or did not fail? */ lua_pushstring(buff); @@ -153,31 +179,32 @@ static void io_read (void) static void io_write (void) { + FILE *f = getfile("_OUTPUT"); int arg = 1; int status = 1; char *s; - while ((s = lua_opt_string(arg++, NULL, "write")) != NULL) - status = status && (fputs(s, lua_outfile) != EOF); + while ((s = luaL_opt_string(arg++, NULL)) != NULL) + status = status && (fputs(s, f) != EOF); pushresult(status); } static void io_execute (void) { - lua_pushnumber(system(lua_check_string(1, "execute"))); + lua_pushnumber(system(luaL_check_string(1))); } static void io_remove (void) { - pushresult(remove(lua_check_string(1, "remove")) == 0); + pushresult(remove(luaL_check_string(1)) == 0); } static void io_rename (void) { - pushresult(rename(lua_check_string(1, "rename"), - lua_check_string(2, "rename")) == 0); + pushresult(rename(luaL_check_string(1), + luaL_check_string(2)) == 0); } @@ -190,7 +217,7 @@ static void io_tmpname (void) static void io_getenv (void) { - lua_pushstring(getenv(lua_check_string(1, "getenv"))); /* if NULL push nil */ + lua_pushstring(getenv(luaL_check_string(1))); /* if NULL push nil */ } @@ -198,7 +225,7 @@ static void io_date (void) { time_t t; struct tm *tm; - char *s = lua_opt_string(1, "%c", "date"); + char *s = luaL_opt_string(1, "%c"); char b[BUFSIZ]; time(&t); tm = localtime(&t); if (strftime(b,sizeof(b),s,tm)) @@ -229,34 +256,36 @@ static void io_debug (void) static void lua_printstack (FILE *f) { - int level = 0; + int level = 1; /* skip level 0 (it's this function) */ lua_Object func; - fprintf(f, "Active Stack:\n"); while ((func = lua_stackedfunction(level++)) != LUA_NOOBJECT) { char *name; int currentline; - fprintf(f, "\t"); + char *filename; + int linedefined; + lua_funcinfo(func, &filename, &linedefined); + fprintf(f, (level==2) ? "Active Stack:\n\t" : "\t"); switch (*lua_getobjname(func, &name)) { case 'g': fprintf(f, "function %s", name); break; - case 'f': - fprintf(f, "`%s' fallback", name); + case 't': + fprintf(f, "`%s' tag method", name); break; default: { - char *filename; - int linedefined; - lua_funcinfo(func, &filename, &linedefined); if (linedefined == 0) fprintf(f, "main of %s", filename); else if (linedefined < 0) fprintf(f, "%s", filename); else fprintf(f, "function (%s:%d)", filename, linedefined); + filename = NULL; } } if ((currentline = lua_currentline(func)) > 0) fprintf(f, " at line %d", currentline); + if (filename) + fprintf(f, " [in file %s]", filename); fprintf(f, "\n"); } } @@ -264,13 +293,13 @@ static void lua_printstack (FILE *f) static void errorfb (void) { - char *s = lua_opt_string(1, "(no messsage)", NULL); - fprintf(stderr, "lua: %s\n", s); + fprintf(stderr, "lua: %s\n", lua_getstring(lua_getparam(1))); lua_printstack(stderr); } -static struct lua_reg iolib[] = { + +static struct luaL_reg iolib[] = { {"readfrom", io_readfrom}, {"writeto", io_writeto}, {"appendto", io_appendto}, @@ -289,7 +318,13 @@ static struct lua_reg iolib[] = { void iolib_open (void) { - lua_infile=stdin; lua_outfile=stdout; - luaI_openlib(iolib, (sizeof(iolib)/sizeof(iolib[0]))); - lua_setfallback("error", errorfb); + lua_tagio = lua_newtag(); + setfile(stdin, "_INPUT"); + setfile(stdout, "_OUTPUT"); + setfile(stdin, "_STDIN"); + setfile(stdout, "_STDOUT"); + setfile(stderr, "_STDERR"); + luaL_openlib(iolib, (sizeof(iolib)/sizeof(iolib[0]))); + lua_pushcfunction(errorfb); + lua_seterrormethod(); } diff --git a/clients/lib/old/mathlib.c b/clients/lib/mathlib.c similarity index 57% rename from clients/lib/old/mathlib.c rename to clients/lib/mathlib.c index 07081e4..e929d6a 100644 --- a/clients/lib/old/mathlib.c +++ b/clients/lib/mathlib.c @@ -3,12 +3,13 @@ ** Mathematics library to LUA */ -char *rcs_mathlib="$Id: mathlib.c,v 1.17 1996/04/30 21:13:55 roberto Exp $"; +char *rcs_mathlib="$Id: mathlib.c,v 1.25 1997/06/19 18:03:04 roberto Exp $"; #include #include #include "lualib.h" +#include "auxlib.h" #include "lua.h" #ifndef PI @@ -19,7 +20,7 @@ char *rcs_mathlib="$Id: mathlib.c,v 1.17 1996/04/30 21:13:55 roberto Exp $"; static void math_abs (void) { - double d = lua_check_number(1, "abs"); + double d = luaL_check_number(1); if (d < 0) d = -d; lua_pushnumber (d); } @@ -27,7 +28,7 @@ static void math_abs (void) static void math_sin (void) { - double d = lua_check_number(1, "sin"); + double d = luaL_check_number(1); lua_pushnumber (sin(TORAD(d))); } @@ -35,7 +36,7 @@ static void math_sin (void) static void math_cos (void) { - double d = lua_check_number(1, "cos"); + double d = luaL_check_number(1); lua_pushnumber (cos(TORAD(d))); } @@ -43,98 +44,82 @@ static void math_cos (void) static void math_tan (void) { - double d = lua_check_number(1, "tan"); + double d = luaL_check_number(1); lua_pushnumber (tan(TORAD(d))); } static void math_asin (void) { - double d = lua_check_number(1, "asin"); + double d = luaL_check_number(1); lua_pushnumber (TODEGREE(asin(d))); } static void math_acos (void) { - double d = lua_check_number(1, "acos"); + double d = luaL_check_number(1); lua_pushnumber (TODEGREE(acos(d))); } static void math_atan (void) { - double d = lua_check_number(1, "atan"); + double d = luaL_check_number(1); lua_pushnumber (TODEGREE(atan(d))); } static void math_atan2 (void) { - double d1 = lua_check_number(1, "atan2"); - double d2 = lua_check_number(2, "atan2"); + double d1 = luaL_check_number(1); + double d2 = luaL_check_number(2); lua_pushnumber (TODEGREE(atan2(d1, d2))); } static void math_ceil (void) { - double d = lua_check_number(1, "ceil"); + double d = luaL_check_number(1); lua_pushnumber (ceil(d)); } static void math_floor (void) { - double d = lua_check_number(1, "floor"); + double d = luaL_check_number(1); lua_pushnumber (floor(d)); } static void math_mod (void) { - int d1 = (int)lua_check_number(1, "mod"); - int d2 = (int)lua_check_number(2, "mod"); - lua_pushnumber (d1%d2); + float x = luaL_check_number(1); + float y = luaL_check_number(2); + lua_pushnumber(fmod(x, y)); } static void math_sqrt (void) { - double d = lua_check_number(1, "sqrt"); + double d = luaL_check_number(1); lua_pushnumber (sqrt(d)); } -static int old_pow; static void math_pow (void) { - lua_Object o1 = lua_getparam (1); - lua_Object o2 = lua_getparam (2); - lua_Object op = lua_getparam(3); - if (!lua_isnumber(o1) || !lua_isnumber(o2) || *(lua_getstring(op)) != 'p') - { - lua_Object old = lua_getref(old_pow); - lua_pushobject(o1); - lua_pushobject(o2); - lua_pushobject(op); - if (lua_callfunction(old) != 0) - lua_error(NULL); - } - else - { - double d1 = lua_getnumber(o1); - double d2 = lua_getnumber(o2); - lua_pushnumber (pow(d1,d2)); - } + double d1 = luaL_check_number(1); + double d2 = luaL_check_number(2); + lua_pushnumber(pow(d1,d2)); } static void math_min (void) { int i=1; - double dmin = lua_check_number(i, "min"); + double dmin = luaL_check_number(i); while (lua_getparam(++i) != LUA_NOOBJECT) { - double d = lua_check_number(i, "min"); + double d = luaL_check_number(i); if (d < dmin) dmin = d; } lua_pushnumber (dmin); @@ -143,10 +128,10 @@ static void math_min (void) static void math_max (void) { int i=1; - double dmax = lua_check_number(i, "max"); + double dmax = luaL_check_number(i); while (lua_getparam(++i) != LUA_NOOBJECT) { - double d = lua_check_number(i, "max"); + double d = luaL_check_number(i); if (d > dmax) dmax = d; } lua_pushnumber (dmax); @@ -154,33 +139,33 @@ static void math_max (void) static void math_log (void) { - double d = lua_check_number(1, "log"); + double d = luaL_check_number(1); lua_pushnumber (log(d)); } static void math_log10 (void) { - double d = lua_check_number(1, "log10"); + double d = luaL_check_number(1); lua_pushnumber (log10(d)); } static void math_exp (void) { - double d = lua_check_number(1, "exp"); + double d = luaL_check_number(1); lua_pushnumber (exp(d)); } static void math_deg (void) { - float d = lua_check_number(1, "deg"); + float d = luaL_check_number(1); lua_pushnumber (d*180./PI); } static void math_rad (void) { - float d = lua_check_number(1, "rad"); + float d = luaL_check_number(1); lua_pushnumber (d/180.*PI); } @@ -191,11 +176,11 @@ static void math_random (void) static void math_randomseed (void) { - srand(lua_check_number(1, "randomseed")); + srand(luaL_check_number(1)); } -static struct lua_reg mathlib[] = { +static struct luaL_reg mathlib[] = { {"abs", math_abs}, {"sin", math_sin}, {"cos", math_cos}, @@ -224,7 +209,9 @@ static struct lua_reg mathlib[] = { */ void mathlib_open (void) { - luaI_openlib(mathlib, (sizeof(mathlib)/sizeof(mathlib[0]))); - old_pow = lua_refobject(lua_setfallback("arith", math_pow), 1); + luaL_openlib(mathlib, (sizeof(mathlib)/sizeof(mathlib[0]))); + lua_pushcfunction(math_pow); + lua_pushnumber(0); /* to get its tag */ + lua_settagmethod(lua_tag(lua_pop()), "pow"); } diff --git a/clients/lib/old/Makefile b/clients/lib/old/Makefile deleted file mode 100644 index b966861..0000000 --- a/clients/lib/old/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -# makefile for lualib - -LUA= ../../.. - -include $(LUA)/config - -EXTRA_DEFS= $(POPEN) $(NOSTRERROR) - -OBJS= iolib.o mathlib.o strlib.o -SRCS= iolib.c mathlib.c strlib.c - -SLIB= $(LIB)/liboldlualib.a - -# dynamic libraries only work for SunOs -DLIB= $(LIB)/liboldlualib.so.$(VERSION) - -all: $(SLIB) - -dynamic: $(DLIB) - -$(SLIB): $(OBJS) - ar rcu $@ $(OBJS) - $(RANLIB) $(SLIB) - -$(DLIB): $(OBJS) - ld -o $@ $(OBJS) - -clean: - rm -f $(OBJS) $(SLIB) $(DLIB) - -co: - co -f -M -rv2_4 $(SRCS) - -klean: clean - rm -f $(SRCS) diff --git a/clients/lib/old/iolib.c b/clients/lib/old/iolib.c deleted file mode 100644 index 9ed7e47..0000000 --- a/clients/lib/old/iolib.c +++ /dev/null @@ -1,618 +0,0 @@ -/* -** iolib.c -** Input/output library to LUA -*/ - -char *rcs_iolib="$Id: iolib.c,v 1.44 1996/05/03 20:10:59 roberto Exp $"; - -#include -#include -#include -#include -#include -#include - -#include "lua.h" -#include "luadebug.h" -#include "lualib.h" - -static FILE *in=stdin, *out=stdout; - - -#ifdef POPEN -FILE *popen(); -int pclose(); -#else -#define popen(x,y) NULL /* that is, popen always fails */ -#define pclose(x) (-1) -#endif - - -static void pushresult (int i) -{ - if (i) - lua_pushnumber (1); - else - lua_pushnil(); -} - -static void closeread (void) -{ - if (in != stdin) - { - if (pclose(in) == -1) - fclose(in); - in = stdin; - } -} - -static void closewrite (void) -{ - if (out != stdout) - { - if (pclose(out) == -1) - fclose(out); - out = stdout; - } -} - -/* -** Open a file to read. -** LUA interface: -** status = readfrom (filename) -** where: -** status = 1 -> success -** status = nil -> error -*/ -static void io_readfrom (void) -{ - if (lua_getparam (1) == LUA_NOOBJECT) - { /* restore standart input */ - closeread(); - lua_pushnumber (1); - } - else - { - char *s = lua_check_string(1, "readfrom"); - FILE *fp = (*s == '|') ? popen(s+1, "r") : fopen(s, "r"); - if (fp == NULL) - lua_pushnil(); - else - { - closeread(); - in = fp; - lua_pushnumber (1); - } - } -} - - -/* -** Open a file to write. -** LUA interface: -** status = writeto (filename) -** where: -** status = 1 -> success -** status = nil -> error -*/ -static void io_writeto (void) -{ - if (lua_getparam (1) == LUA_NOOBJECT) /* restore standart output */ - { - closewrite(); - lua_pushnumber (1); - } - else - { - char *s = lua_check_string(1, "writeto"); - FILE *fp = (*s == '|') ? popen(s+1,"w") : fopen(s,"w"); - if (fp == NULL) - lua_pushnil(); - else - { - closewrite(); - out = fp; - lua_pushnumber (1); - } - } -} - - -/* -** Open a file to write appended. -** LUA interface: -** status = appendto (filename) -** where: -** status = 1 -> success -** status = nil -> error -*/ -static void io_appendto (void) -{ - char *s = lua_check_string(1, "appendto"); - FILE *fp = fopen (s, "a"); - if (fp == NULL) - lua_pushnil(); - else - { - if (out != stdout) fclose (out); - out = fp; - lua_pushnumber(1); - } -} - - -static char getformat (char *f, int *just, int *m, int *n) -{ - int t; - switch (*f++) - { - case 'q': case 'Q': - case 's': case 'S': - case 'i': case 'I': - t = tolower(*(f-1)); - break; - case 'f': case 'F': case 'g': case 'G': case 'e': case 'E': - t = 'f'; - break; - default: - t = 0; /* to avoid compiler warnings */ - lua_arg_error("read/write (format)"); - } - *just = (*f == '<' || *f == '>' || *f == '|') ? *f++ : '>'; - if (isdigit(*f)) - { - *m = 0; - while (isdigit(*f)) - *m = *m*10 + (*f++ - '0'); - } - else - *m = -1; - if (*f == '.') - { - f++; /* skip point */ - *n = 0; - while (isdigit(*f)) - *n = *n*10 + (*f++ - '0'); - } - else - *n = -1; - return t; -} - - -/* -** Read a variable. On error put nil on stack. -** LUA interface: -** variable = read ([format]) -** -** O formato pode ter um dos seguintes especificadores: -** -** s ou S -> para string -** f ou F, g ou G, e ou E -> para reais -** i ou I -> para inteiros -** -** Estes especificadores podem vir seguidos de numero que representa -** o numero de campos a serem lidos. -*/ - -static int read_until_char (int del) -{ - int c; - while((c = fgetc(in)) != EOF && c != del) - luaI_addchar(c); - return c; -} - -static void read_until_blank (void) -{ - int c; - while((c = fgetc(in)) != EOF && !isspace(c)) - luaI_addchar(c); - if (c != EOF) ungetc(c,in); -} - -static void read_m (int m) -{ - int c; - while (m-- && (c = fgetc(in)) != EOF) - luaI_addchar(c); -} - - -static void read_free (void) -{ - int c; - while (isspace(c=fgetc(in))) - ; - if (c == EOF) - { - lua_pushnil(); - return; - } - if (c == '\"' || c == '\'') - { /* string */ - c = read_until_char(c); - if (c == EOF) - lua_pushnil(); - else - lua_pushstring(luaI_addchar(0)); - } - else - { - double d; - char dummy; - char *s; - luaI_addchar(c); - read_until_blank(); - s = luaI_addchar(0); - if (sscanf(s, "%lf %c", &d, &dummy) == 1) - lua_pushnumber(d); - else - lua_pushstring(s); - } -} - -static void io_read (void) -{ - lua_Object o = lua_getparam (1); - luaI_addchar(0); /* initialize buffer */ - if (o == LUA_NOOBJECT) /* free format */ - read_free(); - else /* formatted */ - { - int m, dummy1, dummy2; - switch (getformat(lua_check_string(1, "read"), &dummy1, &m, &dummy2)) - { - case 's': - { - char *s; - if (m < 0) - read_until_blank(); - else - read_m(m); - s = luaI_addchar(0); - if ((m >= 0 && strlen(s) == m) || (m < 0 && strlen(s) > 0)) - lua_pushstring(s); - else - lua_pushnil(); - break; - } - - case 'i': /* can read as float, since it makes no difference to Lua */ - case 'f': - { - double d; - int result; - if (m < 0) - result = fscanf(in, "%lf", &d); - else - { - read_m(m); - result = sscanf(luaI_addchar(0), "%lf", &d); - } - if (result == 1) - lua_pushnumber(d); - else - lua_pushnil(); - break; - } - default: - lua_arg_error("read (format)"); - } - } -} - - -/* -** Read characters until a given one. The delimiter is not read. -*/ -static void io_readuntil (void) -{ - int del, c; - lua_Object p = lua_getparam(1); - luaI_addchar(0); /* initialize buffer */ - if (p == LUA_NOOBJECT || lua_isnil(p)) - del = EOF; - else - del = *lua_check_string(1, "readuntil"); - c = read_until_char(del); - if (c != EOF) ungetc(c,in); - lua_pushstring(luaI_addchar(0)); -} - - -/* -** Write a variable. On error put 0 on stack, otherwise put 1. -** LUA interface: -** status = write (variable [,format]) -** -** O formato pode ter um dos seguintes especificadores: -** -** s ou S -> para string -** f ou F, g ou G, e ou E -> para reais -** i ou I -> para inteiros -** -** Estes especificadores podem vir seguidos de: -** -** [?][m][.n] -** -** onde: -** ? -> indica justificacao -** < = esquerda -** | = centro -** > = direita (default) -** m -> numero maximo de campos (se exceder estoura) -** n -> indica precisao para -** reais -> numero de casas decimais -** inteiros -> numero minimo de digitos -** string -> nao se aplica -*/ - -static int write_fill (int n, int c) -{ - while (n--) - if (fputc(c, out) == EOF) - return 0; - return 1; -} - -static int write_string (char *s, int just, int m) -{ - int status; - int l = strlen(s); - int pre; /* number of blanks before string */ - if (m < 0) m = l; - else if (l > m) - { - write_fill(m, '*'); - return 0; - } - pre = (just == '<') ? 0 : (just == '>') ? m-l : (m-l)/2; - status = write_fill(pre, ' '); - status = status && fprintf(out, "%s", s) >= 0; - status = status && write_fill(m-(l+pre), ' '); - return status; -} - -static int write_quoted (int just, int m) -{ - luaI_addchar(0); - luaI_addquoted(lua_check_string(1, "write")); - return write_string(luaI_addchar(0), just, m); -} - -static int write_float (int just, int m, int n) -{ - char buffer[100]; - lua_Object p = lua_getparam(1); - float number; - if (!lua_isnumber(p)) return 0; - number = lua_getnumber(p); - if (n >= 0) - sprintf(buffer, "%.*f", n, number); - else - sprintf(buffer, "%g", number); - return write_string(buffer, just, m); -} - - -static int write_int (int just, int m, int n) -{ - char buffer[100]; - lua_Object p = lua_getparam(1); - int number; - if (!lua_isnumber(p)) return 0; - number = (int)lua_getnumber(p); - if (n >= 0) - sprintf(buffer, "%.*d", n, number); - else - sprintf(buffer, "%d", number); - return write_string(buffer, just, m); -} - - -static void io_write (void) -{ - int status = 0; - if (lua_getparam (2) == LUA_NOOBJECT) /* free format */ - { - lua_Object o1 = lua_getparam(1); - int t = lua_type(o1); - if (t == LUA_T_NUMBER) - status = fprintf (out, "%g", lua_getnumber(o1)) >= 0; - else if (t == LUA_T_STRING) - status = fprintf (out, "%s", lua_getstring(o1)) >= 0; - } - else /* formated */ - { - int just, m, n; - switch (getformat(lua_check_string(2, "write"), &just, &m, &n)) - { - case 's': - { - lua_Object p = lua_getparam(1); - if (lua_isstring(p)) - status = write_string(lua_getstring(p), just, m); - else - status = 0; - break; - } - case 'q': - status = write_quoted(just, m); - break; - case 'f': - status = write_float(just, m, n); - break; - case 'i': - status = write_int(just, m, n); - break; - } - } - if (status) - lua_pushnumber(status); - else - lua_pushnil(); -} - -/* -** Execute a executable program using "system". -** Return the result of execution. -*/ -static void io_execute (void) -{ - lua_pushnumber(system(lua_check_string(1, "execute"))); -} - -/* -** Remove a file. On error return nil. -*/ -static void io_remove (void) -{ - pushresult(remove(lua_check_string(1, "remove")) == 0); -} - -static void io_rename (void) -{ - char *f1 = lua_check_string(1, "rename"); - char *f2 = lua_check_string(2, "rename"); - pushresult(rename(f1, f2) == 0); -} - -static void io_tmpname (void) -{ - lua_pushstring(tmpnam(NULL)); -} - -static void io_errorno (void) -{ -/* lua_pushstring(strerror(errno));*/ -} - - -/* -** To get a environment variable -*/ -static void io_getenv (void) -{ - char *env = getenv(lua_check_string(1, "getenv")); - lua_pushstring(env); /* if NULL push nil */ -} - -/* -** Return user formatted time stamp -*/ -static void io_date (void) -{ - time_t t; - struct tm *tm; - char *s; - char b[BUFSIZ]; - if (lua_getparam(1) == LUA_NOOBJECT) - s = "%c"; - else - s = lua_check_string(1, "date"); - time(&t); tm = localtime(&t); - if (strftime(b,sizeof(b),s,tm)) - lua_pushstring(b); - else - lua_error("invalid `date' format"); -} - -/* -** To exit -*/ -static void io_exit (void) -{ - lua_Object o = lua_getparam(1); - int code = lua_isnumber(o) ? (int)lua_getnumber(o) : 1; - exit(code); -} - -/* -** To debug a lua program. Start a dialog with the user, interpreting - lua commands until an 'cont'. -*/ -static void io_debug (void) -{ - while (1) - { - char buffer[250]; - fprintf(stderr, "lua_debug> "); - if (fgets(buffer, sizeof(buffer), stdin) == 0) return; - if (strcmp(buffer, "cont") == 0) return; - lua_dostring(buffer); - } -} - - -static void lua_printstack (FILE *f) -{ - int level = 0; - lua_Object func; - fprintf(f, "Active Stack:\n"); - while ((func = lua_stackedfunction(level++)) != LUA_NOOBJECT) - { - char *name; - int currentline; - fprintf(f, "\t"); - switch (*lua_getobjname(func, &name)) - { - case 'g': - fprintf(f, "function %s", name); - break; - case 'f': - fprintf(f, "`%s' fallback", name); - break; - default: - { - char *filename; - int linedefined; - lua_funcinfo(func, &filename, &linedefined); - if (linedefined == 0) - fprintf(f, "main of %s", filename); - else if (linedefined < 0) - fprintf(f, "%s", filename); - else - fprintf(f, "function (%s:%d)", filename, linedefined); - } - } - if ((currentline = lua_currentline(func)) > 0) - fprintf(f, " at line %d", currentline); - fprintf(f, "\n"); - } -} - - -static void errorfb (void) -{ - lua_Object o = lua_getparam(1); - char *s = lua_isstring(o) ? lua_getstring(o) : "(no messsage)"; - fprintf(stderr, "lua: %s\n", s); - lua_printstack(stderr); -} - - -static struct lua_reg iolib[] = { -{"readfrom", io_readfrom}, -{"writeto", io_writeto}, -{"appendto", io_appendto}, -{"read", io_read}, -{"readuntil",io_readuntil}, -{"write", io_write}, -{"execute", io_execute}, -{"remove", io_remove}, -{"rename", io_rename}, -{"tmpname", io_tmpname}, -{"ioerror", io_errorno}, -{"getenv", io_getenv}, -{"date", io_date}, -{"exit", io_exit}, -{"debug", io_debug}, -{"print_stack", errorfb} -}; - -void iolib_open (void) -{ - luaI_openlib(iolib, (sizeof(iolib)/sizeof(iolib[0]))); - lua_setfallback("error", errorfb); -} diff --git a/clients/lib/old/strlib.c b/clients/lib/old/strlib.c deleted file mode 100644 index 6a99871..0000000 --- a/clients/lib/old/strlib.c +++ /dev/null @@ -1,276 +0,0 @@ -/* -** strlib.c -** String library to LUA -*/ - -char *rcs_strlib="$Id: strlib.c,v 1.23 1996/04/30 21:13:55 roberto Exp $"; - -#include -#include -#include -#include -#include - -#include "lua.h" -#include "lualib.h" - - -void lua_arg_error(char *funcname) -{ - char buff[100]; - sprintf(buff, "incorrect arguments to function `%s'", funcname); - lua_error(buff); -} - -char *lua_check_string (int numArg, char *funcname) -{ - lua_Object o = lua_getparam(numArg); - if (!lua_isstring(o)) - lua_arg_error(funcname); - return lua_getstring(o); -} - -double lua_check_number (int numArg, char *funcname) -{ - lua_Object o = lua_getparam(numArg); - if (!lua_isnumber(o)) - lua_arg_error(funcname); - return lua_getnumber(o); -} - -static int lua_opt_number (int numArg, int def, char *funcname) -{ - return (lua_getparam(numArg) == LUA_NOOBJECT) ? def : - (int)lua_check_number(numArg, funcname); -} - -char *luaI_addchar (int c) -{ - static char *buff = NULL; - static int max = 0; - static int n = 0; - if (n >= max) - { - if (max == 0) - { - max = 100; - buff = (char *)malloc(max); - } - else - { - max *= 2; - buff = (char *)realloc(buff, max); - } - if (buff == NULL) - lua_error("memory overflow"); - } - buff[n++] = c; - if (c == 0) - n = 0; /* prepare for next string */ - return buff; -} - - -/* -** Return the position of the first caracter of a substring into a string -** LUA interface: -** n = strfind (string, substring, init, end) -*/ -static void str_find (void) -{ - char *s1 = lua_check_string(1, "strfind"); - char *s2 = lua_check_string(2, "strfind"); - int init = lua_opt_number(3, 1, "strfind") - 1; - char *f = (init>=0 && init<=strlen(s1)) ? strstr(s1+init,s2) : NULL; - if (f != NULL) - { - int pos = f-s1+1; - if (lua_opt_number(4, INT_MAX, "strfind") >= pos+strlen(s2)-1) - lua_pushnumber (pos); - else - lua_pushnil(); - } - else - lua_pushnil(); -} - -/* -** Return the string length -** LUA interface: -** n = strlen (string) -*/ -static void str_len (void) -{ - char *s = lua_check_string(1, "strlen"); - lua_pushnumber(strlen(s)); -} - - -/* -** Return the substring of a string, from start to end -** LUA interface: -** substring = strsub (string, start, end) -*/ -static void str_sub (void) -{ - char *s = lua_check_string(1, "strsub"); - int start = (int)lua_check_number(2, "strsub"); - int end = lua_opt_number(3, strlen(s), "strsub"); - if (end < start || start < 1 || end > strlen(s)) - lua_pushliteral(""); - else - { - luaI_addchar(0); - while (start <= end) - luaI_addchar(s[start++ - 1]); - lua_pushstring (luaI_addchar(0)); - } -} - -/* -** Convert a string to lower case. -** LUA interface: -** lowercase = strlower (string) -*/ -static void str_lower (void) -{ - char *s = lua_check_string(1, "strlower"); - luaI_addchar(0); - while (*s) - luaI_addchar(tolower(*s++)); - lua_pushstring(luaI_addchar(0)); -} - - -/* -** Convert a string to upper case. -** LUA interface: -** uppercase = strupper (string) -*/ -static void str_upper (void) -{ - char *s = lua_check_string(1, "strupper"); - luaI_addchar(0); - while (*s) - luaI_addchar(toupper(*s++)); - lua_pushstring(luaI_addchar(0)); -} - -/* -** get ascii value of a character in a string -*/ -static void str_ascii (void) -{ - char *s = lua_check_string(1, "ascii"); - int pos = lua_opt_number(2, 1, "ascii") - 1; - if (pos<0 || pos>=strlen(s)) - lua_arg_error("ascii"); - lua_pushnumber(s[pos]); -} - -void luaI_addquoted (char *s) -{ - luaI_addchar('"'); - for (; *s; s++) - { - if (*s == '"' || *s == '\\' || *s == '\n') - luaI_addchar('\\'); - luaI_addchar(*s); - } - luaI_addchar('"'); -} - -#define MAX_CONVERTION 2000 -#define MAX_FORMAT 50 - -static void str_format (void) -{ - int arg = 1; - char *strfrmt = lua_check_string(arg++, "format"); - luaI_addchar(0); /* initialize */ - while (*strfrmt) - { - if (*strfrmt != '%') - luaI_addchar(*strfrmt++); - else if (*++strfrmt == '%') - luaI_addchar(*strfrmt++); /* %% */ - else - { /* format item */ - char form[MAX_FORMAT]; /* store the format ('%...') */ - char buff[MAX_CONVERTION]; /* store the formated value */ - int size = 0; - int i = 0; - form[i++] = '%'; - form[i] = *strfrmt++; - while (!isalpha(form[i])) - { - if (isdigit(form[i])) - { - size = size*10 + form[i]-'0'; - if (size >= MAX_CONVERTION) - lua_error("format size/precision too long in function `format'"); - } - else if (form[i] == '.') - size = 0; /* re-start */ - if (++i >= MAX_FORMAT) - lua_error("bad format in function `format'"); - form[i] = *strfrmt++; - } - form[i+1] = 0; /* ends string */ - switch (form[i]) - { - case 'q': - luaI_addquoted(lua_check_string(arg++, "format")); - buff[0] = '\0'; /* addchar already done */ - break; - case 's': - { - char *s = lua_check_string(arg++, "format"); - if (strlen(s) >= MAX_CONVERTION) - lua_error("string argument too long in function `format'"); - sprintf(buff, form, s); - break; - } - case 'c': case 'd': case 'i': case 'o': - case 'u': case 'x': case 'X': - sprintf(buff, form, (int)lua_check_number(arg++, "format")); - break; - case 'e': case 'E': case 'f': case 'g': - sprintf(buff, form, lua_check_number(arg++, "format")); - break; - default: /* also treat cases 'pnLlh' */ - lua_error("invalid format option in function `format'"); - } - for (i=0; buff[i]; i++) /* move formated value to result */ - luaI_addchar(buff[i]); - } - } - lua_pushstring(luaI_addchar(0)); /* push the result */ -} - - -void luaI_openlib (struct lua_reg *l, int n) -{ - int i; - for (i=0; i #include @@ -11,6 +11,7 @@ char *rcs_strlib="$Id: strlib.c,v 1.33 1996/11/20 13:47:59 roberto Exp $"; #include #include "lua.h" +#include "auxlib.h" #include "lualib.h" @@ -23,7 +24,7 @@ struct lbuff { static struct lbuff lbuffer = {NULL, 0, 0}; -static char *lua_strbuffer (unsigned long size) +static char *strbuffer (unsigned long size) { if (size > lbuffer.max) { /* ANSI "realloc" doesn't need this test, but some machines (Sun!) @@ -38,55 +39,24 @@ static char *lua_strbuffer (unsigned long size) static char *openspace (unsigned long size) { - char *buff = lua_strbuffer(lbuffer.size+size); + char *buff = strbuffer(lbuffer.size+size); return buff+lbuffer.size; } -void lua_arg_check(int cond, char *funcname) -{ - if (!cond) { - char buff[100]; - sprintf(buff, "incorrect argument to function `%s'", funcname); - lua_error(buff); - } -} - -char *lua_check_string (int numArg, char *funcname) -{ - lua_Object o = lua_getparam(numArg); - lua_arg_check(lua_isstring(o), funcname); - return lua_getstring(o); -} - -char *lua_opt_string (int numArg, char *def, char *funcname) -{ - return (lua_getparam(numArg) == LUA_NOOBJECT) ? def : - lua_check_string(numArg, funcname); -} - -double lua_check_number (int numArg, char *funcname) -{ - lua_Object o = lua_getparam(numArg); - lua_arg_check(lua_isnumber(o), funcname); - return lua_getnumber(o); -} - -long lua_opt_number (int numArg, long def, char *funcname) -{ - return (lua_getparam(numArg) == LUA_NOOBJECT) ? def : - (long)lua_check_number(numArg, funcname); -} - char *luaI_addchar (int c) { if (lbuffer.size >= lbuffer.max) - lua_strbuffer(lbuffer.max == 0 ? 100 : lbuffer.max*2); + strbuffer(lbuffer.max == 0 ? 100 : lbuffer.max*2); lbuffer.b[lbuffer.size++] = c; - if (c == 0) - lbuffer.size = 0; /* prepare for next string */ return lbuffer.b; } +void luaI_emptybuff (void) +{ + lbuffer.size = 0; /* prepare for next string */ +} + + static void addnchar (char *s, int n) { char *b = openspace(n); @@ -99,35 +69,13 @@ static void addstr (char *s) addnchar(s, strlen(s)); } -/* -** Interface to strtok -*/ -static void str_tok (void) -{ - char *s1 = lua_check_string(1, "strtok"); - char *del = lua_check_string(2, "strtok"); - lua_Object t = lua_createtable(); - int i = 1; - /* As strtok changes s1, and s1 is "constant", make a copy of it */ - s1 = strcpy(lua_strbuffer(strlen(s1+1)), s1); - while ((s1 = strtok(s1, del)) != NULL) { - lua_pushobject(t); - lua_pushnumber(i++); - lua_pushstring(s1); - lua_storesubscript(); - s1 = NULL; /* prepare for next strtok */ - } - lua_pushobject(t); - lua_pushnumber(i-1); /* total number of tokens */ -} - /* ** Return the string length */ static void str_len (void) { - lua_pushnumber(strlen(lua_check_string(1, "strlen"))); + lua_pushnumber(strlen(luaL_check_string(1))); } /* @@ -135,15 +83,18 @@ static void str_len (void) */ static void str_sub (void) { - char *s = lua_check_string(1, "strsub"); - long start = (long)lua_check_number(2, "strsub"); - long end = lua_opt_number(3, strlen(s), "strsub"); - if (1 <= start && start <= end && end <= strlen(s)) { - luaI_addchar(0); + char *s = luaL_check_string(1); + long l = strlen(s); + long start = (long)luaL_check_number(2); + long end = (long)luaL_opt_number(3, -1); + if (start < 0) start = l+start+1; + if (end < 0) end = l+end+1; + if (1 <= start && start <= end && end <= l) { + luaI_emptybuff(); addnchar(s+start-1, end-start+1); lua_pushstring(luaI_addchar(0)); } - else lua_pushliteral(""); + else lua_pushstring(""); } /* @@ -151,10 +102,10 @@ static void str_sub (void) */ static void str_lower (void) { - char *s = lua_check_string(1, "strlower"); - luaI_addchar(0); - while (*s) - luaI_addchar(tolower(*s++)); + char *s; + luaI_emptybuff(); + for (s = luaL_check_string(1); *s; s++) + luaI_addchar(tolower((unsigned char)*s)); lua_pushstring(luaI_addchar(0)); } @@ -163,18 +114,18 @@ static void str_lower (void) */ static void str_upper (void) { - char *s = lua_check_string(1, "strupper"); - luaI_addchar(0); - while (*s) - luaI_addchar(toupper(*s++)); + char *s; + luaI_emptybuff(); + for (s = luaL_check_string(1); *s; s++) + luaI_addchar(toupper((unsigned char)*s)); lua_pushstring(luaI_addchar(0)); } static void str_rep (void) { - char *s = lua_check_string(1, "strrep"); - int n = (int)lua_check_number(2, "strrep"); - luaI_addchar(0); + char *s = luaL_check_string(1); + int n = (int)luaL_check_number(2); + luaI_emptybuff(); while (n-- > 0) addstr(s); lua_pushstring(luaI_addchar(0)); @@ -185,9 +136,9 @@ static void str_rep (void) */ static void str_ascii (void) { - char *s = lua_check_string(1, "ascii"); - long pos = lua_opt_number(2, 1, "ascii") - 1; - lua_arg_check(0<=pos && possrc) /* non empty match? */ + src = e; /* skip it */ + else if (*src) + luaI_addchar(*src++); + else break; if (anchor) break; } addstr(src); @@ -470,12 +441,12 @@ static void str_gsub (void) static void str_set (void) { - char *item = lua_check_string(1, "strset"); + char *item = luaL_check_string(1); int i; - lua_arg_check(*item_end(item) == 0, "strset"); - luaI_addchar(0); + luaL_arg_check(*luaL_item_end(item) == 0, 1, "wrong format"); + luaI_emptybuff(); for (i=1; i<256; i++) /* 0 cannot be part of a set */ - if (singlematch(i, item)) + if (luaL_singlematch(i, item)) luaI_addchar(i); lua_pushstring(luaI_addchar(0)); } @@ -497,8 +468,8 @@ void luaI_addquoted (char *s) static void str_format (void) { int arg = 1; - char *strfrmt = lua_check_string(arg++, "format"); - luaI_addchar(0); /* initialize */ + char *strfrmt = luaL_check_string(arg++); + luaI_emptybuff(); /* initialize */ while (*strfrmt) { if (*strfrmt != '%') luaI_addchar(*strfrmt++); @@ -510,26 +481,26 @@ static void str_format (void) char *initf = strfrmt-1; /* -1 to include % */ strfrmt = match(strfrmt, "[-+ #]*(%d*)%.?(%d*)", 0); if (capture[0].len > 3 || capture[1].len > 3) /* < 1000? */ - lua_error("invalid format (width/precision too long)"); + lua_error("invalid format (width or precision too long)"); strncpy(form, initf, strfrmt-initf+1); /* +1 to include convertion */ form[strfrmt-initf+1] = 0; buff = openspace(1000); /* to store the formated value */ switch (*strfrmt++) { case 'q': - luaI_addquoted(lua_check_string(arg++, "format")); + luaI_addquoted(luaL_check_string(arg++)); continue; case 's': { - char *s = lua_check_string(arg++, "format"); + char *s = luaL_check_string(arg++); buff = openspace(strlen(s)); sprintf(buff, form, s); break; } case 'c': case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': - sprintf(buff, form, (int)lua_check_number(arg++, "format")); + sprintf(buff, form, (int)luaL_check_number(arg++)); break; case 'e': case 'E': case 'f': case 'g': - sprintf(buff, form, lua_check_number(arg++, "format")); + sprintf(buff, form, luaL_check_number(arg++)); break; default: /* also treat cases 'pnLlh' */ lua_error("invalid format option in function `format'"); @@ -541,16 +512,7 @@ static void str_format (void) } -void luaI_openlib (struct lua_reg *l, int n) -{ - int i; - for (i=0; i #include #include "lua.h" +#include "auxlib.h" #include "lualib.h" @@ -19,6 +20,74 @@ char *rcs_lua="$Id: lua.c,v 1.14 1996/09/24 17:30:28 roberto Exp $"; #endif +#define DEBUG 0 + +static void testC (void) +{ +#if DEBUG +#define getnum(s) ((*s++) - '0') +#define getname(s) (nome[0] = *s++, nome) + + static int locks[10]; + lua_Object reg[10]; + char nome[2]; + char *s = luaL_check_string(1); + nome[1] = 0; + while (1) { + switch (*s++) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + lua_pushnumber(*(s-1) - '0'); + break; + + case 'c': reg[getnum(s)] = lua_createtable(); break; + + case 'P': reg[getnum(s)] = lua_pop(); break; + + case 'g': { int n = getnum(s); reg[n] = lua_getglobal(getname(s)); break; } + + case 'G': { int n = getnum(s); + reg[n] = lua_rawgetglobal(getname(s)); + break; + } + + case 'l': locks[getnum(s)] = lua_ref(1); break; + case 'L': locks[getnum(s)] = lua_ref(0); break; + + case 'r': { int n = getnum(s); reg[n] = lua_getref(locks[getnum(s)]); break; } + + case 'u': lua_unref(locks[getnum(s)]); break; + + case 'p': { int n = getnum(s); reg[n] = lua_getparam(getnum(s)); break; } + + case '=': lua_setglobal(getname(s)); break; + + case 's': lua_pushstring(getname(s)); break; + + case 'o': lua_pushobject(reg[getnum(s)]); break; + + case 'f': lua_call(getname(s)); break; + + case 'i': reg[getnum(s)] = lua_gettable(); break; + + case 'I': reg[getnum(s)] = lua_rawgettable(); break; + + case 't': lua_settable(); break; + + case 'T': lua_rawsettable(); break; + + default: luaL_verror("unknown command in `testC': %c", *(s-1)); + + } + if (*s == 0) return; + if (*s++ != ' ') lua_error("missing ` ' between commands in `testC'"); + } +#else + lua_error("`testC' not active"); +#endif +} + + static void manual_input (void) { if (isatty(0)) { @@ -41,6 +110,7 @@ int main (int argc, char *argv[]) iolib_open (); strlib_open (); mathlib_open (); + lua_register("testC", testC); if (argc < 2) manual_input(); else for (i=1; imanual.id - latex manual.tex - dvips -o manual.ps manual.dvi - gzip manual.ps - mv manual.ps.gz refman.ps.gz - rm -f manual.* - -clean: - rm -f manual.tex - -co: - co -f -M manual.tex luac.man - -klean: clean - rm -f manual.tex manual.ps manual.dvi diff --git a/doc/idx.html b/doc/idx.html new file mode 100644 index 0000000..26fb74b --- /dev/null +++ b/doc/idx.html @@ -0,0 +1,241 @@ + + +Lua 3.0 Reference Manual - Word Index + + + + +

Index

+ +..
+abs
+acos
+add event
+Adjustment
+and
+appendto
+arg
+arguments
+arithmetic operators
+arrays
+ascii
+asin
+assert
+Assignment
+associative arrays
+atan2
+atan
+basic types
+block
+C pointers
+C2lua
+call
+captures
+ceil
+character class
+chunk
+closing a file
+Coercion
+collectgarbage
+Comments
+concatenation event
+concatenation
+condition expression
+constructors
+cos
+date
+debug pragma
+div event
+dofile
+dostring
+error method
+error
+event
+execute
+exit
+exponentiation
+Expressions
+file handles
+floor
+format
+function call
+Function Definitions
+function event
+function
+gc event
+ge event
+getenv
+getglobal event
+getglobal
+gettable event
+gettagmethod
+gettagmethod
+global environment
+Global variables
+gsub
+gt event
+Identifiers
+if-then-else
+index event
+_INPUT
+le event
+Literal strings
+Local variables
+log10
+log
+logical operators
+lt event
+Lua Stand-alone
+lua2C
+LUA_ANYTAG
+luac
+luac
+lua_callfunction
+lua_CFunction
+lua_collectgarbage
+lua_createtable
+lua_dofile
+lua_dostring
+lua_error
+lua_getcfunction
+lua_getglobal
+lua_getnumber
+lua_getparam
+lua_getref
+lua_getresult
+lua_getstring
+lua_gettable
+lua_gettagmethod
+lua_getuserdata
+lua_iscfunction
+lua_isfunction
+lua_isnil
+lua_isnumber
+lua_isstring
+lua_istable
+lua_isuserdata
+lua_lua2C
+lua_newtag
+LUA_NOOBJECT
+lua_Object
+lua_pop
+lua_pushcfunction
+lua_pushnil
+lua_pushnumber
+lua_pushobject
+lua_pushstring
+lua_pushuserdata
+lua_pushusertag
+lua_rawgetglobal
+lua_rawgetglobal
+lua_rawgetglobal
+lua_rawsettable
+lua_ref
+lua_register
+lua_seterrormethod
+lua_setglobal
+lua_settable
+lua_settag
+lua_settagmethod
+lua_tag
+lua_unref
+max
+methods
+min
+mod
+mul event
+multiple assignment
+newtag
+next
+nextvar
+nil
+not
+number
+Numerical constants
+Operator precedence
+or
+_OUTPUT
+packed results
+pattern item
+pattern
+piped input
+piped output
+popen
+popen
+pow event
+pre-compilation
+predefined functions
+Pre-processor
+print
+random
+randomseed
+rawgetglobal
+rawgettable
+rawsetglobal
+rawsettable
+read pattern
+read
+readfrom
+records
+reference
+reflexivity
+relational operators
+remove
+rename
+repeat-until
+reserved words
+return statement
+return
+self
+setglobal event
+setglobal
+settable event
+settag
+settagmethod
+settagmethod
+short-cut evaluation
+Simple Expressions
+sin
+skips
+sqrt
+statements
+_STDERR
+_STDIN
+_STDOUT
+strfind
+string
+strlen
+strlower
+strrep
+strsub
+strupper
+sub event
+table
+Tag Methods
+tag
+tag
+tan
+tmpname
+tokens
+tonumber
+tostring
+type
+Types and Tags
+unm event
+userdata
+vararg
+version 1.1
+version 2.1
+version 2.2
+version 2.4
+version 2.5
+while-do
+write
+writeto
+ +
+Last update: +Tue Jul 1 07:55:45 EST 1997 +by lhf. + + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..5ce16c4 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,85 @@ + + +Lua 3.0 Reference Manual - Index + + + + +

Reference Manual of the Programming Language Lua 3.0

+

+Roberto Ierusalimschy, +Luiz Henrique de Figueiredo, +Waldemar Celes +
+lua@tecgraf.puc-rio.br
+TeCGraf, +Computer Science Department, +PUC-Rio +

+ +


+Abstract. +Lua is an extension programming language designed to be used +as a configuration language for any program that needs one. +This document describes version 3.0 of the Lua programming language and +the API that allows interaction between Lua programs and their host C programs. +
+ +Sumário. +Lua é uma linguagem de extensão projetada para ser usada como +linguagem de configuração em qualquer programa que precise de uma. +Este documento descreve a versão 3.0 da linguagem de +programação Lua e a Interface de Programação (API) que permite +a interação entre programas Lua e programas C hospedeiros. +
+ + + +
+Last update: +Tue Jul 1 07:55:45 EST 1997 +by lhf. + + diff --git a/doc/luac.html b/doc/luac.html new file mode 100644 index 0000000..7d43ff1 --- /dev/null +++ b/doc/luac.html @@ -0,0 +1,88 @@ + + + +
+luac manual page +
+ +Table of Contents

+ +

NAME

+luac - Lua compiler

+ +

SYNOPSIS

+luac [ -c | -u ] [ -d ] [ -l ] [ -p ] [ -q ] [ -v ] [ -o outputfile ] sourcefile ...

+ +

DESCRIPTION

+luac is the Lua compiler. It translates programs written in the Lua programming language into binary files that can be loaded and executed with lua_dofile in C or dofile in Lua.

+luac produces a single output file containing the bytecode for all named source files. By default, the output file is named luac.out, but you can change this with the -o option.

+You can use "-" to indicate stdin as a source file.

+luac can also load and list binary files.

+ +

OPTIONS

+
+
-c
compile (this is the default).

+

+
+
+
-u
undump.

+

+
+
+
-d
turns debugging on.

+

+
+
+
-l
produces a listing of the compiled bytecode for Lua's virtual machine. This is the default when undumping.

+

+
+
+
-p
parses sources files but does not generate any output file.

+

+
+
+
-q
quiet; procudes no listing. This is the default when compiling.

+

+
+
+
-v
prints version information.

+

+
+
+
-o outputfile
Name the output file output, instead of the default luac.out. The output file cannot be a source file.

+

+
+ +

FILES

+
+
luac.out
default output file

+

+
+ +

SEE ALSO

+lua(1)

+Reference Manual of the Programming Language Lua

+ +

DIAGNOSTICS

+Error messages should be self explanatory.

+ +

BUGS

+Inherits any bugs from Lua, but Lua has no bugs...

+ +

AUTHORS

+W. Celes, R. Ierusalimschy & L. H. de Figueiredo (lua@tecgraf.puc-rio.br)

+ +


+Table of Contents

+

+ diff --git a/doc/luac.man b/doc/luac.man deleted file mode 100644 index e64e570..0000000 --- a/doc/luac.man +++ /dev/null @@ -1,75 +0,0 @@ -.\" $Id: luac.man,v 1.3 1996/03/28 20:24:55 lhf Exp $ -.TH LUAC 1 "12 March 1996" -.SH NAME -luac \- Lua compiler -.SH SYNOPSIS -.B luac -[ -.B \-dlpv -] -[ -.B \-o -.I outputfile -] -.I sourcefile -\&.\|.\|. -.SH DESCRIPTION -.B luac -is the Lua compiler. -It translates programs written in the Lua programming language -into binary files that can be loaded and executed with -.B lua_dofile -in C or -.B dofile -in Lua. - -.BR luac -produces a single output file containing the bytecode -for all named source files. -By default, -the output file is named -.BR luac.out , -but you can change this with the -.B \-o -option. - -You can use "-" to indicate stdin as a source file. -.SH OPTIONS -.LP -.TP 1i -.B \-d -turns debugging on. -.TP -.B \-l -produces a listing of the compiled bytecode for Lua's virtual machine. -.TP -.B \-p -parses sources files but does not generate any output file. -.TP -.B \-v -prints version information. -.TP -.BI \-o " outputfile" -Name the output file -.IR output , -instead of the default -.BR luac.out . -The output file cannot be a source file. -.SH FILES -.PD 0 -.TP 20 -.B luac.out -default output file -.PD -.SH "SEE ALSO" -.BR lua (1) -.LP -.IR "Reference Manual of the Programming Language Lua" -.SH DIAGNOSTICS -Error messages should be self explanatory. -.SH BUGS -Inherits any bugs from Lua, -but Lua has no bugs... -.SH AUTHORS -W. Celes, R. Ierusalimschy & L. H. de Figueiredo -(lua@icad.puc-rio.br) diff --git a/doc/luac.ps b/doc/luac.ps deleted file mode 100644 index c701ac2..0000000 --- a/doc/luac.ps +++ /dev/null @@ -1,246 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.09 -%%CreationDate: Fri Mar 29 10:45:53 1996 -%%DocumentNeededResources: font Times-Roman -%%+ font Times-Bold -%%+ font Times-Italic -%%DocumentSuppliedResources: procset grops 1.09 0 -%%Pages: 1 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.09 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{ pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[] 0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{} def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Roman -%%IncludeResource: font Times-Bold -%%IncludeResource: font Times-Italic -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 -def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron -/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent -/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen -/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O -/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex -/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y -/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft -/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl -/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen -/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft -/logicalnot/minus/registered/macron/degree/plusminus/twosuperior -/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior -/ordmasculine/guilsinglright/onequarter/onehalf/threequarters -/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE -/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex -/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn -/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla -/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis -/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash -/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def -/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE -/Times-Roman@0 ENC0/Times-Roman RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF(LU)72 48 Q -.034 -.4(AC \( 1 \))-.4 H -(User Commands)157.852 E(LU)157.452 E -.034 -.4(AC \( 1 \))-.4 H/F1 9 -/Times-Bold@0 SF -.18(NA)72 96 S(ME).18 E F0(luac \255 Lua compiler)108 -108 Q F1(SYNOPSIS)72 124.8 Q/F2 10/Times-Bold@0 SF(luac)108 136.8 Q F0 -([)3.75 E F2(\255dlpv)3.75 E F0 3.75(][)3.75 G F2A/F3 10 -/Times-Italic@0 SF(output\214le)3.75 E F0(])3.75 E F3(sour)3.75 E -(ce\214le)-.37 E F0 1.666(...)3.75 G F1(DESCRIPTION)72 153.6 Q F2(luac) -108 165.6 Q F0 .371(is the Lua compiler)2.871 F 5.371(.I)-.55 G 2.871 -(tt)-5.371 G .37(ranslates programs written in the Lua programming lang\ -uage into binary \214les)-2.871 F(that can be loaded and e)108 177.6 Q --.15(xe)-.15 G(cuted with).15 E F2(lua_do\214le)2.5 E F0(in C or)2.5 E -F2(do\214le)2.5 E F0(in Lua.)2.5 E F2(luac)108 201.6 Q F0 .159(produces\ - a single output \214le containing the bytecode for all named source \ -\214les.)2.658 F .159(By def)5.159 F .159(ault, the output)-.1 F -(\214le is named)108 213.6 Q F2(luac.out)2.5 E F0 2.5(,b)C -(ut you can change this with the)-2.7 E F22.5 E F0(option.)2.5 E --1.1(Yo)108 237.6 S 2.5(uc)1.1 G -(an use "-" to indicate stdin as a source \214le.)-2.5 E F1(OPTIONS)72 -254.4 Q F2108 266.4 Q F0(turns deb)60.74 E(ugging on.)-.2 E F2 -108 283.2 Q F0 -(produces a listing of the compiled bytecode for Lua')63.52 E 2.5(sv) --.55 G(irtual machine.)-2.5 E F2108 300 Q F0 -(parses sources \214les b)60.74 E(ut does not generate an)-.2 E 2.5(yo) --.15 G(utput \214le.)-2.5 E F2108 316.8 Q F0(prints v)61.3 E -(ersion information.)-.15 E F2108 333.6 Q F3(output\214le)2.5 E F0 -.657(Name the output \214le)21.02 F F3(output)3.157 E F0 3.157(,i)C .657 -(nstead of the def)-3.157 F(ault)-.1 E F2(luac.out)3.157 E F0 5.657(.T)C -.656(he output \214le cannot be a)-5.657 F(source \214le.)180 345.6 Q F1 -(FILES)72 362.4 Q F2(luac.out)108 374.4 Q F0(def)65.83 E -(ault output \214le)-.1 E F1(SEE ALSO)72 391.2 Q F2(lua)108 403.2 Q F0 -(\(1\))A F3(Refer)108 420 Q(ence Manual of the Pr)-.37 E -.1(og)-.45 G --.15(ra).1 G(mming Langua).15 E .2 -.1(ge L)-.1 H(ua).1 E F1(DIA)72 -436.8 Q(GNOSTICS)-.495 E F0(Error messages should be self e)108 448.8 Q -(xplanatory)-.15 E(.)-.65 E F1 -.09(BU)72 465.6 S(GS).09 E F0 -(Inherits an)108 477.6 Q 2.5(yb)-.15 G(ugs from Lua, b)-2.7 E -(ut Lua has no b)-.2 E(ugs...)-.2 E F1 -.45(AU)72 494.4 S(THORS).45 E F0 -1.84 -.92(W. C)108 506.4 T(eles, R. Ierusalimsch).92 E 2.5(y&L)-.05 G -2.5(.H)-2.5 G 2.5(.d)-2.5 G 2.5(eF)-2.5 G -(igueiredo \(lua@icad.puc-rio.br\))-2.5 E(29 March 1996)72 768 Q -(12 March 1996)142.35 E(1)198.45 E EP -%%Trailer -end -%%EOF diff --git a/doc/luac.txt b/doc/luac.txt deleted file mode 100644 index d198953..0000000 --- a/doc/luac.txt +++ /dev/null @@ -1,66 +0,0 @@ - - - -LUAC(1) User Commands LUAC(1) - - - -NAME - luac - Lua compiler - -SYNOPSIS - luac [ -dlpv ] [ -o outputfile ] sourcefile ... - -DESCRIPTION - luac is the Lua compiler. It translates programs written in - the Lua programming language into binary files that can be - loaded and executed with lua_dofile in C or dofile in Lua. - - luac produces a single output file containing the bytecode - for all named source files. By default, the output file is - named luac.out, but you can change this with the -o option. - - You can use "-" to indicate stdin as a source file. - -OPTIONS - -d turns debugging on. - - -l produces a listing of the compiled bytecode for - Lua's virtual machine. - - -p parses sources files but does not generate any - output file. - - -v prints version information. - - -o outputfile - Name the output file output, instead of the - default luac.out. The output file cannot be a - source file. - -FILES - luac.out default output file - -SEE ALSO - lua(1) - - Reference Manual of the Programming Language Lua - -DIAGNOSTICS - Error messages should be self explanatory. - -BUGS - Inherits any bugs from Lua, but Lua has no bugs... - -AUTHORS - W. Celes, R. Ierusalimschy & L. H. de Figueiredo - (lua@icad.puc-rio.br) - - - - - -Formatted 96/03/29 12 March 1996 1 - - - diff --git a/doc/manual.html b/doc/manual.html new file mode 100644 index 0000000..0c3f531 --- /dev/null +++ b/doc/manual.html @@ -0,0 +1,2545 @@ + +Lua 3.0 Reference Manual + + +

Lua 3.0 Reference Manual

+ + +
+ +

1 - Introduction

+

+Lua is an extension programming language designed to support +general procedural programming with data description +facilities. +It is intended to be used as a light-weight, but powerful, +configuration language for any program that needs one. +Lua has been designed and implemented by +W. Celes, +R. Ierusalimschy and +L. H. de Figueiredo. +

+Lua is implemented as a library, written in C. +Being an extension language, Lua has no notion of a ``main'' program: +it only works embedded in a host client, +called the embedding program. +This host program can invoke functions to execute a piece of +code in Lua, can write and read Lua variables, +and can register C functions to be called by Lua code. +Through the use of C functions, Lua can be augmented to cope with +a wide range of different domains, +thus creating customized programming languages sharing a syntactical framework. +

+Lua is free-distribution software, +and provided as usual with no guarantees, +as stated in the copyright notice in the front page of this manual. +The implementation described in this manual is available +at the following URL's: +

+ http://www.tecgraf.puc-rio.br/lua/ + ftp://ftp.tecgraf.puc-rio.br/pub/lua/lua.tar.gz + +

+

+ +


+ +

2 - Environment and Chunks

+

+All statements in Lua are executed in a global environment. +This environment, which keeps all global variables and functions, +is initialized at the beginning of the embedding program and +persists until its end. +

+The global environment can be manipulated by Lua code or +by the embedding program, +which can read and write global variables +using functions in the library that implements Lua. +

+Global variables do not need declaration. +Any variable is assumed to be global unless explicitly declared local +(see Section 4.5.5). +Before the first assignment, the value of a global variable is nil; +this default can be changed (see Section 4.8). +

+The unit of execution of Lua is called a chunk. +The syntax +\footnote{As usual, {a} means 0 or more a's, +[a] means an optional a and ('a)+ means +one or more a's.} +for chunks is: +

+chunk ::= {stat | function} [ret] + +A chunk may contain statements and function definitions, +and may be in a file or in a string inside the host program. +A chunk may optionally end with a return statement (see Section 4.5.3). +When a chunk is executed, first all its functions and statements are compiled, +then the statements are executed in sequential order. +All modifications a chunk effects on the global environment persist +after its end. +Those include modifications to global variables and definitions +of new functions +\footnote{Actually, a function definition is an +assignment to a global variable (see Section 3).}. +

+Chunks may be pre-compiled into binary form; +see program luac for details. +Text files with chunks and their binary pre-compiled forms +are interchangeable. +Lua automatically detects the file type and acts accordingly. + +

+ + +


+ +

3 - Types and Tags

+

+Lua is a dynamically typed language. +Variables do not have types; only values do. +Therefore, there are no type definitions in the language. +All values carry their own type. +Besides a type, all values also have a tag. +

+There are six basic types in Lua: nil, number, +string, function, userdata, and table. +Nil is the type of the value nil, +whose main property is to be different from any other value. +Number represents real (floating-point) numbers, +while string has the usual meaning. +The function type returns a string describing the type +of a given value (see Section 6.1). +

+Functions are considered first-class values in Lua. +This means that functions can be stored in variables, +passed as arguments to other functions and returned as results. +When a function is defined in Lua, its body is compiled and stored +in a given variable. +Lua can call (and manipulate) functions written in Lua and +functions written in C. +They can be distinguished by their tags: +all Lua functions have the same tag, +and all C functions have the same tag, +which is different from the tag of a Lua function. +

+The type userdata is provided to allow +arbitrary C pointers to be stored in Lua variables. +It corresponds to a void* and has no pre-defined operations in Lua, +besides assignment and equality test. +However, by using tag methods, +the programmer may define operations for userdata values +(see Section 4.8). +

+The type table implements associative arrays, +that is, arrays that can be indexed not only with numbers, +but with any value (except nil). +Therefore, this type may be used not only to represent ordinary arrays, +but also symbol tables, sets, records, etc. +To represent records, Lua uses the field name as an index. +The language supports this representation by +providing a.name as syntactic sugar for a["name"]. +Tables may also carry methods. +Because functions are first class values, +table fields may contain functions. +The form t:f(x) is syntactic sugar for t.f(t,x), +which calls the method f from the table t passing +itself as the first parameter (see Section 4.7). +

+It is important to notice that tables are objects, and not values. +Variables cannot contain tables, only references to them. +Assignment, parameter passing and returns always manipulate references +to tables, and do not imply any kind of copy. +Moreover, tables must be explicitly created before used +(see Section 4.6.7). +

+Tags are mainly used to select tag methods when +some events occur (see Section 4.8). +Each of the types nil, number and string has a different tag. +All values of each of these types have this same pre-defined tag. +Values of type function can have two different tags, +depending on whether they are Lua or C functions. +Finally, +values of type userdata and table can have +as many different tags as needed (see Section 4.8). +Tags are created with the function newtag, +and the function tag returns the tag of a given value. +To change the tag of a given table, +there is the function settag (see Section 6.1). +

+

+ +


+ +

4 - The Language

+

+This section describes the lexis, the syntax and the semantics of Lua. +

+

+ + +

4.1 - Lexical Conventions

+

+Lua is a case-sensitive language. +Identifiers can be any string of letters, digits, and underscores, +not beginning with a digit. +The following words are reserved, and cannot be used as identifiers: + +

+ and do else elseif + end function if local + nil not or repeat + return then until while + +

+The following strings denote other tokens: +

+ ~= <= >= < > == = .. + - * / + % ( ) { } [ ] ; , . ... + +

+Literal strings can be delimited by matching single or double quotes, +and can contain the C-like escape sequences +'\n', '\t' and '\r'. +Literal strings can also be delimited by matching [[ ... ]]. +Literals in this bracketed form may run for several lines, +may contain nested [[ ... ]] pairs, +and do not interpret escape sequences. +This form is specially convenient for +handling strings that contain program pieces or +other quoted strings. +

+Comments start anywhere outside a string with a +double hyphen (--) and run until the end of the line. +Moreover, +the first line of a chunk file is skipped if it starts with # +\footnote{This facility allows the use of Lua as a script interpreter +in Unix systems (see Section 8).}. +

+Numerical constants may be written with an optional decimal part, +and an optional decimal exponent. +Examples of valid numerical constants are: +

+ 4 4.0 0.4 4.57e-3 0.3e12 + +

+ + +

4.2 - The Pre-processor

+

+All lines that start with a $ are handled by a pre-processor. +The $ can be followed by any of the following directives: +

+
debug
- turn on some debugging facilities (see Section 4.9). +
nodebug
- turn off some debugging facilities (see Section 4.9). +
if cond
- starts a conditional part. +If cond is false, then this part is skipped by the lexical analyzer. +
ifnot cond
- starts a conditional part. +If cond is true, then this part is skipped by the lexical analyzer. +
end
- ends a conditional part. +
else
- starts an ``else'' conditional part, +switching the ``skip'' status. +
endinput
- ends the lexical parse of the file. +
+

+Directives can be freely nested. +Particularly, a $endinput may occur inside a $if; +in that case, even the matching $end is not parsed. +

+A cond part may be: +

+
nil
- always false. +
1
- always true. +
name
- true if the value of the +global variable name is different from nil. +Notice that name is evaluated before the chunk starts its execution. +Therefore, actions in a chunk do not affect its own conditional directives. +
+

+ + +

4.3 - Coercion

+

+Lua provides some automatic conversions between values. +Any arithmetic operation applied to a string tries to convert +that string to a number, following the usual rules. +Conversely, whenever a number is used when a string is expected, +that number is converted to a string, according to the following rule: +if the number is an integer, it is written without exponent or decimal point; +otherwise, it is formatted following the %g +conversion specification of the printf function in the +standard C library. +For complete control on how numbers are converted to strings, +use the format function (see Section 6.2). +

+

+ + +

4.4 - Adjustment

+

+Functions in Lua can return many values. +Because there are no type declarations, +the system does not know how many values a function will return, +or how many parameters it needs. +Therefore, sometimes, a list of values must be adjusted, at run time, +to a given length. +If there are more values than are needed, then the last values are thrown away. +If there are more needs than values, then the list is extended with as +many nil's as needed. +Adjustment occurs in multiple assignment and function calls. +

+

+ +

4.5 - Statements

+

+Lua supports an almost conventional set of statements, +similar to those in Pascal or C. +The conventional commands include +assignment, control structures and procedure calls. +Non-conventional commands include table constructors +(see Section 4.6.7), +and local variable declarations (see Section 4.5.5). +

+

4.5.1 - Blocks

+A block is a list of statements, which are executed sequentially. +Any statement can be optionally followed by a semicolon: ++block ::= {stat sc} [ret] +sc ::= [';'] + +For syntactic reasons, a return statement can only be written +as the last statement of a block. +This restriction also avoids some ``statement not reached'' conditions. +

+ +

4.5.2 - Assignment

+The language allows multiple assignment. +Therefore, the syntax for assignment +defines a list of variables on the left side, +and a list of expressions on the right side. +Both lists have their elements separated by commas: ++stat ::= varlist1 '=' explist1 +varlist1 ::= var {',' var} + +This statement first evaluates all values on the right side +and eventual indices on the left side, +and then makes the assignments. +Therefore, it can be used to exchange two values, as in ++ x, y = y, x + +The two lists may have different lengths. +Before the assignment, the list of values is adjusted to +the length of the list of variables (see Section 4.4). +

+A single name can denote a global or a local variable, +or a formal parameter: +

+var ::= name + +Square brackets are used to index a table: ++var ::= var '[' exp1 ']' + +The var should result in a table value, +where the field indexed by the expression value gets the assigned value. +

+The meaning of assignments and evaluations of global variables and +indexed variables can be changed by tag methods (see Section 4.8). +Actually, +an assignment x = val, where x is a global variable, +is equivalent to a call setglobal('x', val); +an assignment t[i] = val is equivalent to +settable_event(t, i, val). +See Section 4.8 for a description of these functions +\footnote{Function setglobal is pre-defined in Lua. +Function settable_event is used only for explanation purposes.}. +

+The syntax var.NAME is just syntactic sugar for +var["NAME"]: +

+var ::= var '.' name + +

+

4.5.3 - Control Structures

+The condition expression of a control structure may return any value. +All values different from nil are considered true; +only nil is considered false. +if's, while's and repeat's have the usual meaning. +

+ +

+stat ::= while exp1 do block end
| repeat block until exp1
| if exp1 then block {elseif} [else block] end +elseif ::= elseif exp1 then block +
+

+A return is used to return values from a function or a chunk. + + +Because they may return more than one value, +the syntax for a return statement is: +

+ret ::= return [explist1] [sc] + +

+ +

4.5.4 - Function Calls as Statements

+Because of possible side-effects, +function calls can be executed as statements: ++stat ::= functioncall + +In this case, returned values are thrown away. +Function calls are explained in Section 4.6.8. +

+ +

4.5.5 - Local Declarations

+Local variables may be declared anywhere inside a block. +Their scope begins after the declaration and lasts until the +end of the block. +The declaration may include an initial assignment: ++stat ::= local declist [init] +declist ::= name {',' name} +init ::= '=' explist1 + +If present, an initial assignment has the same semantics +of a multiple assignment. +Otherwise, all variables are initialized with nil. +

+

+ +

4.6 - Expressions

+

+

4.6.1 - Simple Expressions

+Simple expressions are: ++exp ::= '(' exp ')' +exp ::= nil +exp ::= 'number' +exp ::= 'literal' +exp ::= var + +Numbers (numerical constants) and +string literals are explained in Section 4.1. +Variables are explained in Section 4.5.2. +

+An access to a global variable x is equivalent to a +call getglobal('x'); +an access to an indexed variable t[i] is equivalent to +a call gettable_event(t, i). +See Section 4.8 for a description of these functions +\footnote{Function getglobal is pre-defined in Lua. +Function gettable_event is used only for explanation purposes.}. +

+The non-terminal exp1 is used to indicate that the values +returned by an expression must be adjusted to one single value: +

+exp1 ::= exp + +

+

4.6.2 - Arithmetic Operators

+Lua supports the usual arithmetic operators: +the binary + (addition), +- (subtraction), * (multiplication), +/ (division) and ^ (exponentiation), +and unary - (negation). +If the operands are numbers, or strings that can be converted to +numbers, according to the rules given in Section 4.3, +then all operations except exponentiation have the usual meaning. +Otherwise, an appropriate tag method is called (see Section 4.8). +An exponentiation always calls a tag method. +The standard mathematical library redefines this method for numbers, +giving the expected meaning to exponentiation +(see Section 6.3). +

+

4.6.3 - Relational Operators

+Lua provides the following relational operators: ++ < > <= >= ~= == + +All these return nil as false and a value different from nil as true. +

+Equality first compares the types of its operands. +If they are different, then the result is nil. +Otherwise, their values are compared. +Numbers and strings are compared in the usual way. +Tables, userdata and functions are compared by reference, +that is, two tables are considered equal only if they are the same table. +The operator ~= is exactly the negation of equality (==). +Note that the conversion rules of Section 4.3 +do not apply to equality comparisons. +Thus, "0"==0 evaluates to false. +

+The other operators work as follows. +If both arguments are numbers, then they are compared as such. +Otherwise, if both arguments are strings, +their values are compared using lexicographical order. +Otherwise, the ``order'' tag method is called (see Section 4.8). +

+

4.6.4 - Logical Operators

+Like control structures, all logical operators +consider nil as false and anything else as true. +The logical operators are: + ++ and or not + +The operator and returns nil if its first argument is nil; +otherwise, it returns its second argument. +The operator or returns its first argument +if it is different from nil; +otherwise, it returns its second argument. +Both and and or use short-cut evaluation, +that is, +the second operand is evaluated only when necessary. +

+

4.6.5 - Concatenation

+Lua offers a string concatenation operator, +denoted by ``..''. +If operands are strings or numbers, then they are converted to +strings according to the rules in Section 4.3. +Otherwise, the ``concat'' tag method is called (see Section 4.8). +

+

4.6.6 - Precedence

+Operator precedence follows the table below, +from the lower to the higher priority: ++ and or + < > <= >= ~= == + .. + + - + * / + not - (unary) + ^ + +All binary operators are left associative, +except for ^ (exponentiation), +which is right associative. +

+ +

4.6.7 - Table Constructors

+Table constructors are expressions that create tables; +every time a constructor is evaluated, a new table is created. +Constructors can be used to create empty tables, +or to create a table and initialize some fields. +

+The general syntax for constructors is: +

+tableconstructor ::= '{' fieldlist '}' +fieldlist ::= lfieldlist | ffieldlist | lfieldlist ';' ffieldlist +lfieldlist ::= [lfieldlist1] +ffieldlist ::= [ffieldlist1] + +

+The form lfieldlist1 is used to initialize lists. +

+lfieldlist1 ::= exp {',' exp} [','] + +The expressions in the list are assigned to consecutive numerical indices, +starting with 1. +For example: ++ a = {"v1", "v2", 34} + +is essentially equivalent to: ++ temp = {} + temp[1] = "v1" + temp[2] = "v2" + temp[3] = 34 + a = temp + +

+The form ffieldlist1 initializes other fields in a table: +

+ffieldlist1 ::= ffield {',' ffield} [','] +ffield ::= '[' exp ']' \ter {= exp | name '=' exp} + +For example: ++ a = {[f(k)] = g(y), x = 1, y = 3, [0] = b+c} + +is essentially equivalent to: ++ temp = {} + temp[f(k)] = g(y) + temp.x = 1 -- or temp["x"] = 1 + temp.y = 3 -- or temp["y"] = 3 + temp[0] = b+c + a = temp + +An expression like {x = 1, y = 4} is +in fact syntactic sugar for {["x"] = 1, ["y"] = 4}. +

+ +

4.6.8 - Function Calls

+A function call has the following syntax: ++functioncall ::= var realParams + +Here, var can be any variable (global, local, indexed, etc). +If its value has type function, +then this function is called. +Otherwise, the ``function'' tag method is called, +having as first parameter the value of var, +and then the original call parameters. +

+The form: +

+functioncall ::= var ':' name realParams + +can be used to call ``methods''. +A call var:name(...) +is syntactic sugar for ++ var.name(var, ...) + +except that var is evaluated only once. +

+

+realParams ::= '(' [explist1] ')' +realParams ::= tableconstructor +explist1 ::= exp1 {',' exp1} + +All argument expressions are evaluated before the call. +A call of the form f{...} is syntactic sugar for +f({...}), that is, +the parameter list is a single new table. +

+Because a function can return any number of results +(see Section 4.5.3), +the number of results must be adjusted before used. +If the function is called as a statement (see Section 4.5.4), +then its return list is adjusted to 0, +thus discarding all returned values. +If the function is called in a place that needs a single value +(syntactically denoted by the non-terminal exp1), +then its return list is adjusted to 1, +thus discarding all returned values but the first one. +If the function is called in a place that can hold many values +(syntactically denoted by the non-terminal exp), +then no adjustment is made. +

+

+ + +

4.7 - Function Definitions

+

+Functions in Lua can be defined anywhere in the global level of a chunk. +The syntax for function definition is: +

+function ::= function var '(' [parlist1] ')' block end + +

+When Lua pre-compiles a chunk, +all its function bodies are pre-compiled, too. +Then, when Lua ``executes'' the function definition, +its body is stored, with type function, +into the variable var. +It is in this sense that +a function definition is an assignment to a global variable. +

+Parameters act as local variables, +initialized with the argument values. +

+parlist1 ::= '...' +parlist1 ::= name {',' name} [',' '...'] + + + +When a function is called, +the list of arguments is adjusted to +the length of the list of parameters (see Section 4.4), +unless the function is a vararg function, +indicated by the dots (...) at the end of its parameter list. +A vararg function does not adjust its argument list; +instead, it collects any extra arguments in an implicit parameter, +called arg. +This parameter is always initialized as a table, +with a field n with the number of extra arguments, +and the extra arguments at positions 1, 2, ... +

+As an example, suppose definitions like: +

+ function f(a, b) end + function g(a, b, ...) end + +Then, we have the following mapping from arguments to parameters: ++ CALL PARAMETERS +

+ f(3) a=3, b=nil + f(3, 4) a=3, b=4 + f(3, 4, 5) a=3, b=4 +

+ g(3) a=3, b=nil, arg={n=0} + g(3, 4) a=3, b=4, arg={n=0} + g(3, 4, 5, 8) a=3, b=4, arg={5, 8; n=2} +

+

+Results are returned using the return statement (see Section 4.5.3). +If control reaches the end of a function without a return instruction, +then the function returns with no results. +

+There is a special syntax for defining methods, +that is, functions that have an extra parameter self. +

+function ::= function var ':' name '(' [parlist1] ')' block end + +Thus, a declaration like ++function v:f (...) + ... +end + +is equivalent to ++function v.f (self, ...) + ... +end + +that is, the function gets an extra formal parameter called self. +Notice that +the variable v must have been +previously initialized with a table value. +

+

+ + +

4.8 - Tag Methods

+

+Lua provides a powerful mechanism to extend its semantics, +called Tag Methods. +A tag method (TM) is a programmer-defined function +that can be called at many key points of the evaluation of a program, +allowing a programmer to change the standard Lua behavior at these points. +Each of these points is called an event. +

+The tag method called for any specific event is selected +according to the tag of the values involved +in the event (see Section 3). +The function settagmethod changes the tag method +associated with a given pair <tag, event>. +Its first parameter is the tag, the second the event name +(a string, see below), +and the third parameter is the new method (a function), +or nil to restore the default behavior. +The function returns the previous tag method. +Another function, gettagmethod, +receives a tag and an event name and returns the +current method associated with the pair. +

+Tag methods are called in the following events, +identified by the given names. +The semantics of tag methods is better explained by a Lua function +describing the behavior of the interpreter at each event. +The function not only shows when a tag method is called, +but also its arguments, its results and the default behavior. +Please notice that the code shown here is only illustrative; +the real behavior is hard coded in the interpreter, +and it is much more efficient than this simulation. +All functions used in these descriptions +(rawgetglobal, tonumber, call, etc) +are described in Section 6.1. +

+

+

+

``add'':
+called when a + operation is applied to non numerical operands. +

+The function getbinmethod defines how Lua chooses a tag method +for a binary operation. +First Lua tries the first operand. +If its tag does not define a tag method for the operation, +then Lua tries the second operand. +If it also fails, then it gets a tag method from tag 0: +

+ function getbinmethod (op1, op2, event) + return gettagmethod(tag(op1), event) or + gettagmethod(tag(op2), event) or + gettagmethod(0, event) + end + ++ function add_event (op1, op2) + local o1, o2 = tonumber(op1), tonumber(op2) + if o1 and o2 then -- both operands are numeric + return o1+o2 -- '+' here is the primitive 'add' + else -- at least one of the operands is not numeric. + local tm = getbinmethod(op1, op2, "add") + if tm then + -- call the method with both operands and an extra + -- argument with the event name + return tm(op1, op2, "add") + else -- no tag method available: Default behavior + error("unexpected type at arithmetic operation") + end + end + end + +

+

``sub'':
+called when a - operation is applied to non numerical operands. +Behavior similar to "add" event. +

+

``mul'':
+called when a * operation is applied to non numerical operands. +Behavior similar to "add" event. +

+

``div'':
+called when a / operation is applied to non numerical operands. +Behavior similar to "add" event. +

+

``pow'':
+called when a ^ operation is applied. ++ function pow_event (op1, op2) + local tm = getbinmethod(op1, op2, "pow") + if tm then + -- call the method with both operands and an extra + -- argument with the event name + return tm(op1, op2, "pow") + else -- no tag method available: Default behavior + error("unexpected type at arithmetic operation") + end + end + +

+

``unm'':
+called when an unary - operation is applied to a non numerical operand. ++ function unm_event (op) + local o = tonumber(op) + if o then -- operand is numeric + return -o -- '-' here is the primitive 'unm' + else -- the operand is not numeric. + -- Try to get a tag method from the operand; + -- if it does not have one, try a "global" one (tag 0) + local tm = gettagmethod(tag(op), "unm") or + gettagmethod(0, "unm") + if tm then + -- call the method with the operand, nil, and an extra + -- argument with the event name + return tm(op, nil, "unm") + else -- no tag method available: Default behavior + error("unexpected type at arithmetic operation") + end + end + end + +

+

``lt'':
+called when a < operation is applied to non numerical +or non string operands. ++ function lt_event (op1, op2) + if type(op1) == "number" and type(op2) == "number" then + return op1 < op2 -- numeric comparison + elseif type(op1) == "string" and type(op2) == "string" then + return op1 < op2 -- lexicographic comparison + else + local tm = getbinmethod(op1, op2, "lt") + if tm then + return tm(op1, op2, "lt") + else + error("unexpected type at comparison"); + end + end + end + +

+

``gt'':
+called when a > operation is applied to non numerical +or non string operands. +Behavior similar to "lt" event. +

+

``le'':
+called when a <= operation is applied to non numerical +or non string operands. +Behavior similar to "lt" event. +

+

``ge'':
+called when a >= operation is applied to non numerical +or non string operands. +Behavior similar to "lt" event. +

+

``concat'':
+called when a concatenation is applied to non string operands. ++ function concat_event (op1, op2) + if (type(op1) == "string" or type(op1) == "number") and + (type(op2) == "string" or type(op2) == "number") then + return op1..op2 -- primitive string concatenation + else + local tm = getbinmethod(op1, op2, "concat") + if tm then + return tm(op1, op2, "concat") + else + error("unexpected type for concatenation") + end + end + end + +

+

``index'':
+called when Lua tries to retrieve the value of an index +not present in a table. +See event "gettable" for its semantics. +

+

``getglobal'':
+called whenever Lua accesses a global variable. +This method can only be set for nil and for tags +created by newtag. ++ function getglobal (varname) + local value = rawgetglobal(varname) + local tm = gettagmethod(tag(value), "getglobal") + if not tm then + return value + else + return tm(varname, value) + end + end + +Notice: the function getglobal is pre-defined in Lua (see Section 6.1). +

+

``setglobal'':
+called whenever Lua assigns to a global variable. +This method cannot be set for numbers, strings, and tables and +userdata with default tags. ++ function setglobal (varname, newvalue) + local oldvalue = rawgetglobal(varname) + local tm = gettagmethod(tag(oldvalue), "setglobal") + if not tm then + return rawsetglobal(varname, newvalue) + else + return tm(varname, oldvalue, newvalue) + end + end + +Notice: the function setglobal is pre-defined in Lua (see Section 6.1). +

+

``gettable'':
+called whenever Lua accesses an indexed variable. +This method cannot be set for tables with default tag. ++ function gettable_event (table, index) + local tm = gettagmethod(tag(table), "gettable") + if tm then + return tm(table, index) + elseif type(table) ~= "table" then + error("indexed expression not a table"); + else + local v = rawgettable(table, index) + tm = gettagmethod(tag(table), "index") + if (v == nil) and tm then + return tm(table, index) + else + return v + end + end + end + +

+

``settable'':
+called when Lua assigns to an indexed variable. +This method cannot be set for tables with default tag. ++ function settable_event (table, index, value) + local tm = gettagmethod(tag(table), "settable") + if tm then + tm(table, index, value) + elseif type(table) ~= "table" then + error("indexed expression not a table") + else + rawsettable(table, index, value) + end + end + +

+

``function'':
+called when Lua tries to call a non function value. ++ function function_event (func, ...) + if type(func) == "function" then + return call(func, arg) + else + local tm = gettagmethod(tag(func), "function") + if tm then + local i = arg.n + while i > 0 do + arg[i+1] = arg[i] + i = i-1 + end + arg.n = arg.n+1 + arg[1] = func + return call(tm, arg) + else + error("call expression not a function") + end + end + end + +

+

``gc'':
+called when Lua is garbage collecting an object. +This method cannot be set for strings, numbers, functions, +and userdata with default tag. +For each object to be collected, +Lua does the equivalent of the following function: ++ function gc_event (obj) + local tm = gettagmethod(tag(obj), "gc") + if tm then + tm(obj) + end + end + +Moreover, at the end of a garbage collection cycle, +Lua does the equivalent of the call gc_event(nil). +

+

+

+

+

+ + +

4.9 - Error Handling

+

+Because Lua is an extension language, +all Lua actions start from C code calling a function from the Lua library. +Whenever an error occurs during Lua compilation or execution, +the error method is called, +and then the corresponding function from the library +(lua_dofile, lua_dostring, or lua_callfunction) +is terminated returning an error condition. +

+The only argument to the error method is a string +describing the error. +The default method prints this message in stderr. +If needed, it is possible to change the error method with the +function seterrormethod, +which gets the new error handler as its only parameter +(see Section 6.1). +The standard I/O library uses this facility to redefine the error method, +using the debug facilities (see Section 7), +in order to print some extra information, +like the call stack. +

+To provide more information about errors, +Lua programs should include the compilation pragma $debug. + + +When an error occurs in a program compiled with this option, +the I/O error routine is able to print the number of the +lines where the calls (and the error) were made. +

+Lua code can explicitly generate an error by calling the built-in +function error (see Section 6.1). +

+

+ +


+ +

5 - The Application Program Interface

+

+This section describes the API for Lua, that is, +the set of C functions available to the host program to communicate +with the Lua library. +The API functions can be classified in the following categories: +

    +
  1. exchanging values between C and Lua; +
  2. executing Lua code; +
  3. manipulating (reading and writing) Lua objects; +
  4. calling Lua functions; +
  5. C functions to be called by Lua; +
  6. manipulating references to Lua Objects. +
+All API functions and related types and constants +are declared in the header file lua.h. +

+ + +

5.1 - Exchanging Values between C and Lua

+Because Lua has no static type system, +all values passed between Lua and C have type +lua_Object, +which works like an abstract type in C that can hold any Lua value. +Values of type lua_Object have no meaning outside Lua; +for instance, +the comparison of two lua_Object's is undefined. +

+To check the type of a lua_Object, +the following functions are available: + + + +

+int lua_isnil (lua_Object object); +int lua_isnumber (lua_Object object); +int lua_isstring (lua_Object object); +int lua_istable (lua_Object object); +int lua_isfunction (lua_Object object); +int lua_iscfunction (lua_Object object); +int lua_isuserdata (lua_Object object); + +All macros return 1 if the object is compatible with the given type, +and 0 otherwise. +The function lua_isnumber accepts numbers and numerical strings, +whereas +lua_isstring accepts strings and numbers (see Section 4.3), +and lua_isfunction accepts Lua and C functions. +

+To check the tag of a lua_Object, +the following function is available: + +

+int lua_tag (lua_Object object); + +

+To translate a value from type lua_Object to a specific C type, +the programmer can use: + + +

+float lua_getnumber (lua_Object object); +char *lua_getstring (lua_Object object); +lua_CFunction lua_getcfunction (lua_Object object); +void *lua_getuserdata (lua_Object object); + +

+lua_getnumber converts a lua_Object to a floating-point number. +This lua_Object must be a number or a string convertible to number +(see Section 4.3); otherwise, the function returns 0. +

+lua_getstring converts a lua_Object to a string (char*). +This lua_Object must be a string or a number; +otherwise, the function returns 0 (the NULL pointer). +This function does not create a new string, +but returns a pointer to a string inside the Lua environment. +Because Lua has garbage collection, +there is no guarantee that such pointer will be valid after the block ends +(see below). +

+lua_getcfunction converts a lua_Object to a C function. +This lua_Object must have type CFunction; +otherwise, the function returns 0 (the NULL pointer). +The type lua_CFunction is explained in Section 5.5. +

+lua_getuserdata converts a lua_Object to void*. +This lua_Object must have type userdata; +otherwise, the function returns 0 (the NULL pointer). +

+Because Lua has automatic memory management and garbage collection, +a lua_Object has a limited scope, +and is only valid inside the block where it was created. +A C function called from Lua is a block, +and its parameters are valid only until its end. +It is good programming practice to convert Lua objects to C values +as soon as they are available, +and never to store lua_Objects in C global variables. +

+A garbage collection cycle can be forced by: + +

+long lua_collectgarbage (long limit); + +This function returns the number of objects collected. +The argument limit makes the next cycle occur only +when that number of new objects have been created. +If limit=0, then Lua uses an adaptable heuristics to set this limit. +

+

+All communication between Lua and C is done through two +abstract data types, called lua2C and C2lua. +The first one, as the name implies, is used to pass values +from Lua to C: parameters when Lua calls C and results when C calls Lua. +The structure C2lua is used in the reverse direction: +parameters when C calls Lua and results when Lua calls C. +

+The structure lua2C is an abstract array, +which can be indexed with the function: + +

+lua_Object lua_lua2C (int number); + +where number starts with 1. +When called with a number larger than the array size, +this function returns LUA_NOOBJECT. +In this way, it is possible to write C functions that receive +a variable number of parameters, +and to call Lua functions that return a variable number of results. +Notice that the structure lua2C cannot be directly modified by C code. +

+The second structure, C2lua, is a stack. +Pushing elements into this stack +is done with the following functions: + + + + + +

+void lua_pushnumber (double n); +void lua_pushstring (char *s); +void lua_pushcfunction (lua_CFunction f); +void lua_pushusertag (void *u, int tag); +void lua_pushnil (void); +void lua_pushobject (lua_Object object); + +All of them receive a C value, +convert it to a corresponding lua_Object, +and leave the result on the top of C2lua. +The function + ++lua_Object lua_pop (void); + +returns a reference to the object at the top of the C2lua stack, +and pops it. +

+As a general rule, all API functions pop from the stack +all elements that they use. +

+Because userdata are objects, +the function lua_pushusertag may create a new userdata. +If Lua has a userdata with the given value (void*) and tag, +that userdata is pushed. +Otherwise, a new userdata is created, with the given value and tag. +If this function is called with +tag=LUA_ANYTAG, +then Lua will try to find any userdata with the given value, +no matter its tag. +If there is no userdata with that value, then a new one is created, +with tag=0. +

+Userdata can have different tags, +whose semantics are only known to the host program. +Tags are created with the function: + +

+int lua_newtag (void); + +The function lua_settag changes the tag of +the object on the top of C2lua (and pops it); +the object must be a userdata or a table. + ++void lua_settag (int tag); + +tag must be a value created with lua_newtag. +

+When C code calls Lua repeatedly, as in a loop, +objects returned by these calls can accumulate, +and may cause a stack overflow. +To avoid this, +nested blocks can be defined with the functions: +

+void lua_beginblock (void); +void lua_endblock (void); + +After the end of the block, +all lua_Object's created inside it are released. +The use of explicit nested blocks is strongly encouraged. +

+ +

5.2 - Executing Lua Code

+A host program can execute Lua chunks written in a file or in a string +using the following functions: + ++int lua_dofile (char *filename); +int lua_dostring (char *string); + +Both functions return an error code: +0, in case of success; non zero, in case of errors. +More specifically, lua_dofile returns 2 if for any reason +it could not open the file. +The function lua_dofile, if called with argument NULL, +executes the stdin stream. +Function lua_dofile is also able to execute pre-compiled chunks. +It automatically detects whether the file is text or binary, +and loads it accordingly (see program luac). +

+These functions return, in structure lua2C, +any values eventually returned by the chunks. +They also empty the stack C2lua. +

+

+ +

5.3 - Manipulating Lua Objects

+To read the value of any global Lua variable, +one uses the function: + ++lua_Object lua_getglobal (char *varname); + +As in Lua, this function may trigger a tag method. +To read the real value of any global variable, +without invoking any tag method, +this function has a raw version: + ++lua_Object lua_rawgetglobal (char *varname); + +

+To store a value previously pushed onto C2lua in a global variable, +there is the function: + +

+void lua_setglobal (char *varname); + +As in Lua, this function may trigger a tag method. +To set the real value of any global variable, +without invoking any tag method, +this function has a raw version: + ++void lua_rawsetglobal (char *varname); + +

+Tables can also be manipulated via the API. +The function + +

+lua_Object lua_gettable (void); + +pops from the stack C2lua a table and an index, +and returns the contents of the table at that index. +As in Lua, this operation may trigger a tag method. +To get the real value of any table index, +without invoking any tag method, +this function has a raw version: + ++lua_Object lua_rawgettable (void); + +

+To store a value in an index, +the program must push the table, the index, +and the value onto C2lua, +and then call the function: + +

+void lua_settable (void); + +Again, the tag method for ``settable'' may be called. +To set the real value of any table index, +without invoking any tag method, +this function has a raw version: + ++void lua_rawsettable (void); + +

+Finally, the function + +

+lua_Object lua_createtable (void); + +creates and returns a new, empty table. +

+

+ +

5.4 - Calling Lua Functions

+Functions defined in Lua by a chunk executed with +dofile or dostring can be called from the host program. +This is done using the following protocol: +first, the arguments to the function are pushed onto C2lua +(see Section 5.1), in direct order, i.e., the first argument is pushed first. +

+Then, the function is called using + +

+int lua_callfunction (lua_Object function); + +This function returns an error code: +0, in case of success; non zero, in case of errors. +Finally, the results (a Lua function may return many values) +are returned in structure lua2C, +and can be retrieved with the macro lua_getresult, + +which is just another name to the function lua_lua2C. +Notice that the function lua_callfunction +pops all elements from the C2lua stack. +

+The following example shows how a C program may do the +equivalent to the Lua code: +

+ a = f("how", t.x, 4) + ++ lua_pushstring("how"); /* 1st argument */ + lua_pushobject(lua_getglobal("t")); /* push value of global 't' */ + lua_pushstring("x"); /* push the string 'x' */ + lua_pushobject(lua_gettable()); /* push result of t.x (= t['x']) */ + lua_pushnumber(4); /* 3th argument */ + lua_callfunction(lua_getglobal("f")); /* call Lua function */ + lua_pushobject(lua_getresult(1)); /* push first result of the call */ + lua_setglobal("a"); /* sets global variable 'a' */ + +

+Some special Lua functions have exclusive interfaces. +A C function can generate a Lua error calling the function + +

+void lua_error (char *message); + +This function never returns. +If the C function has been called from Lua, +then the corresponding Lua execution terminates, +as if an error had occurred inside Lua code. +Otherwise, the whole program terminates with a call to exit(1). +

+The error handler method (see Section 4.9) can be changed with: + +

+lua_Object lua_seterrormethod (void); + +This function sets the object at the top of C2lua +as the new error method, +and returns the old error method value. +

+Tag methods can be changed with: + +

+lua_Object lua_settagmethod (int tag, char *event); + +The first parameter is the tag, +the second is the event name (see Section 4.8); +the new method is pushed from C2lua. +This function returns a lua_Object, +which is the old tag method value. +To get just the current value of a tag method, +there is the function + ++lua_Object lua_gettagmethod (int tag, char *event); + +

+

+ + +

5.5 - C Functions

+To register a C function to Lua, +there is the following macro: + ++#define lua_register(n,f) (lua_pushcfunction(f), lua_setglobal(n)) +/* char *n; */ +/* lua_CFunction f; */ + +which receives the name the function will have in Lua, +and a pointer to the function. +This pointer must have type lua_CFunction, +which is defined as + ++typedef void (*lua_CFunction) (void); + +that is, a pointer to a function with no parameters and no results. +

+In order to communicate properly with Lua, +a C function must follow a protocol, +which defines the way parameters and results are passed. +

+A C function receives its arguments in structure lua2C; +to access them, it uses the macro lua_getparam, +again just another name to lua_lua2C. +To return values, a C function just pushes them onto the stack C2lua, +in direct order (see Section 5.1). +Like a Lua function, a C function called by Lua can also return +many results. +

+For some examples, see files strlib.c, +iolib.c and mathlib.c in Lua distribution. +

+ +

5.6 - References to Lua Objects

+

+As noted in Section 5.5, lua_Objects are volatile. +If the C code needs to keep a lua_Object +outside block boundaries, +then it must create a reference to the object. +The routines to manipulate references are the following: + + +

+int lua_ref (int lock); +lua_Object lua_getref (int ref); +void lua_unref (int ref); + +The function lua_ref creates a reference +to the object that is on the top of the stack, +and returns this reference. +If lock is true, the object is locked: +this means the object will not be garbage collected. +Notice that an unlocked reference may be garbage collected. +Whenever the referenced object is needed, +a call to lua_getref +returns a handle to it; +if the object has been collected, +lua_getref returns LUA_NOOBJECT. +

+When a reference is no longer needed, +it can be freed with a call to lua_unref. +

+

+

+ +


+ +

6 - Predefined Functions and Libraries

+

+The set of predefined functions in Lua is small but powerful. +Most of them provide features that allow some degree of +reflexivity in the language. +Some of these features cannot be simulated with the rest of the +language nor with the standard Lua API. +Others are just convenient interfaces to common API functions. +

+The libraries, on the other hand, provide useful routines +that are implemented directly through the standard API. +Therefore, they are not necessary to the language, +and are provided as separate C modules. +Currently there are three standard libraries: +

    +
  • string manipulation; +
  • mathematical functions (sin, log, etc); +
  • input and output (plus some system facilities). +
+In order to have access to these libraries, +the host program must call the functions +strlib_open, mathlib_open, and iolib_open, +declared in lualib.h. +

+

+ + +

6.1 - Predefined Functions

+

+

call (func, arg, [retmode])

+This function calls function func with +the arguments given by the table arg. +The call is equivalent to ++ func(arg[1], arg[2], ..., arg[arg.n]) + +If arg.n is not defined, +then Lua stops getting arguments at the first nil value. +

+If retmode is absent, +all results from func are just returned by the call. +If retmode is equal to "pack", +the results are packed in a single table. +That is, call returns just one table; +at index n, the table has the total number of results +from the call; +the first result is at index 1, etc. +For instance, the following calls produce the following results: +

+a = call(sin, {5}) --> a = 0.0871557 = sin(5) +a = call(max, {1,4,5; n=2}) --> a = 4 (only 1 and 4 are arguments) +t = {x=1} +a = call(next, {t,nil;n=2}, "pack") --> a={"x", 1; n=2} + +

+

collectgarbage ([limit])

+Forces a garbage collection cycle. +Returns the number of objects collected. +An optional argument, limit, is a number that +makes the next cycle occur when that number of new +objects have been created. +If absent, Lua uses an adaptable algorithm to set +this limit. +collectgarbage is equivalent to +the API function lua_collectgarbage. +

+

dofile (filename)

+This function receives a file name, +opens it, and executes its contents as a Lua chunk, +or as pre-compiled chunks. +When called without arguments, +it executes the contents of the standard input (stdin). +If there is any error executing the file, +then dofile returns nil. +Otherwise, it returns the values returned by the chunk, +or a non nil value if the chunk returns no values. +It issues an error when called with a non string argument. +dofile is equivalent to the API function lua_dofile. +

+

dostring (string [, errmethod])

+This function executes a given string as a Lua chunk. +If there is any error executing the string, it returns nil. +Otherwise, it returns the values returned by the chunk, +or a non nil value if the chunk returns no values. +If provided, errmethod is temporarily set as the error method, +while string runs. +As a particular case, if errmethod is nil, +no error messages will be issued during the execution of the string. +

+ +

newtag ()

+Returns a new tag. +newtag is equivalent to the API function lua_newtag. +

+

next (table, index)

+This function allows a program to traverse all fields of a table. +Its first argument is a table and its second argument +is an index in this table. +It returns the next index of the table and the +value associated with the index. +When called with nil as its second argument, +the function returns the first index +of the table (and its associated value). +When called with the last index, or with nil in an empty table, +it returns nil. +

+In Lua there is no declaration of fields; +semantically, there is no difference between a +field not present in a table or a field with value nil. +Therefore, the function only considers fields with non nil values. +The order in which the indices are enumerated is not specified, +not even for numeric indices +(to traverse a table in numeric order, +use a counter). +If the table is modified in any way during a traversal, +the semantics of next is undefined. +

+This function cannot be written with the standard API. +

+

nextvar (name)

+This function is similar to the function next, +but iterates over the global variables. +Its single argument is the name of a global variable, +or nil to get a first name. +Similarly to next, it returns the name of another variable +and its value, +or nil if there are no more variables. +There can be no assignments to global variables during the traversal; +otherwise the semantics of nextvar is undefined. +

+This function cannot be written with the standard API. +

+

tostring (e)

+This function receives an argument of any type and +converts it to a string in a reasonable format. +

+

print (e1, e2, ...)

+This function receives any number of arguments, +and prints their values in a reasonable format. +Each value is printed in a new line. +This function is not intended for formatted output, +but as a quick way to show a value, +for instance for error messages or debugging. +See Section 6.4 for functions for formatted output. +

+

tonumber (e)

+This function receives one argument, +and tries to convert it to a number. +If the argument is already a number or a string convertible +to a number (see Section 4.3), then it returns that number; +otherwise, it returns nil. +

+ +

type (v)

+This function allows Lua to test the type of a value. +It receives one argument, and returns its type, coded as a string. +The possible results of this function are +"nil" (a string, not the value nil), +"number", +"string", +"table", +"function", +and "userdata". +type is equivalent to the API function lua_type. +

+

tag (v)

+This function allows Lua to test the tag of a value (see Section 3). +It receives one argument, and returns its tag (a number). +tag is equivalent to the API function lua_tag. +

+

settag (t, tag)

+This function sets the tag of a given table (see Section 3). +tag must be a value created with newtag +(see Section 6.1). +For security reasons, +it is impossible to change the tag of a userdata from Lua. +

+

assert (v)

+This function issues an ``assertion failed!'' error +when its argument is nil. +

+ +

error (message)

+This function issues an error message and terminates +the last called function from the library +(lua_dofile, lua_dostring, or lua_callfunction). +It never returns. +error is equivalent to the API function lua_error. +

+

rawgettable (table, index)

+Gets the real value of table[index], +without invoking any tag method. +table must be a table, +and index is any value different from nil. +

+

rawsettable (table, index, value)

+Sets the real value table[index]=value, +without invoking any tag method. +table must be a table, +index is any value different from nil, +and value is any Lua value. +

+

rawsetglobal (name, value)

+This function assigns the given value to a global variable. +The string name does not need to be a syntactically valid variable name. +Therefore, this function can set global variables with strange names like +"m v 1" or 34. +It returns the value of its second argument. +

+

setglobal (name, value)

+This function assigns the given value to a global variable, +or calls a tag method. +Its full semantics is explained in Section 4.8. +

+

rawgetglobal (name)

+This function retrieves the value of a global variable. +The string name does not need to be a +syntactically valid variable name. +

+

getglobal (name)

+This function retrieves the value of a global variable, +or calls a tag method. +Its full semantics is explained in Section 4.8. +

+

seterrormethod (newmethod)

+ + +Sets the error handler (see Section 4.9). +newmethod must be a function or nil, +in which case the error handler does nothing. +Returns the old error handler. +

+

settagmethod (tag, event, newmethod)

+ +This function sets a new tag method to the given pair <tag, event>. +It returns the old method. +If newmethod is nil, +it restores the default behavior for the given event. +

+

gettagmethod (tag, event)

+ +This function returns the current tag method +for a given pair <tag, event>. +

+

+ +

6.2 - String Manipulation

+This library provides generic functions for string manipulation, +such as finding and extracting substrings and pattern matching. +When indexing a string, the first character is at position 1, +not 0, as in C. +

+

strfind (str, pattern [, init [, plain]])

+ +This function looks for the first match of +pattern in str. +If it finds one, then it returns the indices on str +where this occurrence starts and ends; +otherwise, it returns nil. +If the pattern specifies captures, +the captured strings are returned as extra results. +A third optional numerical argument specifies where to start the search; +its default value is 1. +A value of 1 as a fourth optional argument +turns off the pattern matching facilities, +so the function does a plain ``find substring'' operation, +with no characters in pattern being considered ``magic''. +

+

strlen (s)

+Receives a string and returns its length. +

+

strsub (s, i [, j])

+Returns another string, which is a substring of s, +starting at i and running until j. +If i or j are negative, +they are replaced by the length of the string minus their +absolute value plus 1. +Therefore, -1 points to the last character of s +and -2 to the previous one. +If j is absent, it is assumed to be equal to -1 +(which is the same as the string length). +In particular, +the call strsub(s,1,j) returns a prefix of s +with length j, +and the call strsub(s, -i) returns a suffix of s +with length i. +

+

strlower (s)

+Receives a string and returns a copy of that string with all +upper case letters changed to lower case. +All other characters are left unchanged. +

+

strupper (s)

+Receives a string and returns a copy of that string with all +lower case letters changed to upper case. +All other characters are left unchanged. +

+

strrep (s, n)

+Returns a string which is the concatenation of n copies of +the string s. +

+

ascii (s [, i])

+Returns the ASCII code of the character s[i]. +If i is absent, then it is assumed to be 1. +

+

format (formatstring, e1, e2, ...)

+ + +This function returns a formated version of its variable number of arguments +following the description given in its first argument (which must be a string). +The format string follows the same rules as the printf family of +standard C functions. +The only differences are that the options/modifiers +*, l, L, n, p, +and h are not supported, +and there is an extra option, q. +This option formats a string in a form suitable to be safely read +back by the Lua interpreter; +that is, +the string is written between double quotes, +and all double quotes, returns and backslashes in the string +are correctly escaped when written. +For instance, the call ++format('%q', 'a string with "quotes" and \n new line') + +will produce the string: ++"a string with \"quotes\" and \ + new line" + +

+The options c, d, E, e, f, +g i, o, u, X, and x all +expect a number as argument, +whereas q and s expect a string. +Note that the * modifier can be simulated by building +the appropriate format string. +For example, "%*g" can be simulated with +"%"..width.."g". +

+

gsub (s, pat, repl [, table] [, n])

+ +Returns a copy of s, +where all occurrences of the pattern pat have been +replaced by a replacement string specified by repl. +This function also returns, as a second value, +the total number of substitutions made. +

+If repl is a string, then its value is used for replacement. +Any sequence in repl of the form %n +with n between 1 and 9 +stands for the value of the n-th captured substring. +

+If repl is a function, then this function is called every time a +match occurs, with the following arguments: +If table is present, then the first argument is this table +and the second one is a match counter (1 for the first call). +Independently of these two optional arguments, +all captured substrings are passed as arguments, +in order (see below); +If the value returned by this function is a string, +then it is used as the replacement string; +otherwise, the replacement string is the empty string. +

+A last optional parameter n limits +the maximum number of substitutions to occur. +For instance, when n is 1 only the first occurrence of +pat is replaced. +

+See some examples below: +

+ x = gsub("hello world", "(%w%w*)", "%1 %1", 1) + --> x="hello hello world" +

+ x = gsub("home = $HOME, user = $USER", "$(%w%w*)", getenv) + --> x="home = /home/roberto, user = roberto" (for instance) +

+ x = gsub("4+5 = $return 4+5$", "$(.-)%$", dostring) + --> x="4+5 = 9" +

+ function f(t, i, v) return t[v] end + t = {name="lua", version="3.0"} + x = gsub("$name - $version", "$(%w%w*)", f, t) + --> x="lua - 3.0" +

+ t = {"apple", "orange", "lime"} + x = gsub("x and x and x", "x", rawgettable, t) + --> x="apple and orange and lime" +

+ t = {} + dummy, t.n = gsub("first second word", "(%w%w*)", rawsettable, t) + --> t={"first", "second", "word"; n=3} +

+

+

+ +

Patterns

+

+

Character Class:

+a character class is used to represent a set of characters. +The following combinations are allowed in describing a character class: +
+
x
(where x is any character not in the list ()%.[*-?) +- represents the character x itself. +
.
- represents all characters. +
%a
- represents all letters. +
%A
- represents all non letter characters. +
%d
- represents all digits. +
%D
- represents all non digits. +
%l
- represents all lower case letters. +
%L
- represents all non lower case letter characters. +
%s
- represents all space characters. +
%S
- represents all non space characters. +
%u
- represents all upper case letters. +
%U
- represents all non upper case letter characters. +
%w
- represents all alphanumeric characters. +
%W
- represents all non alphanumeric characters. +
%x
(where x is any non alphanumeric character) - +represents the character x. +This is the standard way to escape the magic characters ()%.[*-?. +
[char-set]
- +Represents the class which is the union of all +characters in char-set. +To include a ] in char-set, it must be the first character. +A range of characters may be specified by +separating the end characters of the range with a -; +e.g., A-Z specifies the upper case characters. +If - appears as the first or last character of char-set, +then it represents itself. +All classes %x described above can also be used as +components in a char-set. +All other characters in char-set represent themselves. +
[^char-set]
- +represents the complement of char-set, +where char-set is interpreted as above. +
+

+

Pattern Item:

+a pattern item may be: +
    +
  • +a single character class, +which matches any single character in the class; +
  • +a single character class followed by *, +which matches 0 or more repetitions of characters in the class. +These repetition items will always match the longest possible sequence. +
  • +a single character class followed by -, +which also matches 0 or more repetitions of characters in the class. +Unlike *, +these repetition items will always match the shortest possible sequence. +
  • +a single character class followed by ?, +which matches 0 or 1 occurrence of a character in the class; +
  • +%n, for n between 1 and 9; +such item matches a sub-string equal to the n-th captured string +(see below); +
  • +%bxy, where x and y are two distinct characters; +such item matches strings that start with x, end with y, +and where the x and y are balanced. +That means that, if one reads the string from left to write, +counting plus 1 for an x and minus 1 for a y, +the ending y is the first where the count reaches 0. +For instance, the item %b() matches expressions with +balanced parentheses. +
+

+

Pattern:

+a pattern is a sequence of pattern items. +A ^ at the beginning of a pattern anchors the match at the +beginning of the subject string. +A $ at the end of a pattern anchors the match at the +end of the subject string. +

+

Captures:

+a pattern may contain sub-patterns enclosed in parentheses, +that describe captures. +When a match succeeds, the sub-strings of the subject string +that match captures are stored (captured) for future use. +Captures are numbered according to their left parentheses. +For instance, in the pattern "(a*(.)%w(%s*))", +the part of the string matching "a*(.)%w(%s*)" is +stored as the first capture (and therefore has number 1); +the character matching . is captured with number 2, +and the part matching %s* has number 3. +

+ + +

6.3 - Mathematical Functions

+

+This library is an interface to some functions of the standard C math library. +In addition, it registers a tag method for the binary operator ^ that +returns x^y when applied to numbers x^y. +

+The library provides the following functions: + + + + + +

+abs acos asin atan atan2 ceil cos floor log log10 +max min mod sin sqrt tan random randomseed + +Most of them +are only interfaces to the homonymous functions in the C library, +except that, for the trigonometric functions, +all angles are expressed in degrees, not radians. +

+The function max returns the maximum +value of its numeric arguments. +Similarly, min computes the minimum. +Both can be used with an unlimited number of arguments. +

+The functions random and randomseed are interfaces to +the simple random generator functions rand and srand, +provided by ANSI C. +The function random returns pseudo-random numbers in the +range [0,1). +

+

+ + +

6.4 - I/O Facilities

+

+All input and output operations in Lua are done over two +file handles, one for reading and one for writing. +These handles are stored in two Lua global variables, +called _INPUT and _OUTPUT. +The global variables +_STDIN, _STDOUT and _STDERR +are initialized with file descriptors for +stdin, stdout and stderr. +Initially, _INPUT=_STDIN and _OUTPUT=_STDOUT. + + +

+A file handle is a userdata containing the file stream FILE*, +and with a distinctive tag created by the I/O library. +

+

+Unless otherwise stated, +all I/O functions return nil on failure and +some value different from nil on success. +

+

readfrom (filename)

+

+This function may be called in two ways. +When called with a file name, it opens the named file, +sets its handle as the value of _INPUT, +and returns this value. +It does not close the current input file. +When called without parameters, +it closes the _INPUT file, +and restores stdin as the value of _INPUT. +

+If this function fails, it returns nil, +plus a string describing the error. +

+ +System dependent: if filename starts with a |, +then a piped input is open, via function popen. +Not all systems implement pipes. +Moreover, +the number of files that can be open at the same time is +usually limited and depends on the system. + +

+

writeto (filename)

+

+This function may be called in two ways. +When called with a file name, +it opens the named file, +sets its handle as the value of _OUTPUT, +and returns this value. +It does not close the current output file. +Notice that, if the file already exists, +then it will be completely erased with this operation. +When called without parameters, +this function closes the _OUTPUT file, +and restores stdout as the value of _OUTPUT. + +

+If this function fails, it returns nil, +plus a string describing the error. +

+ +System dependent: if filename starts with a |, +then a piped output is open, via function popen. +Not all systems implement pipes. +Moreover, +the number of files that can be open at the same time is +usually limited and depends on the system. + +

+

appendto (filename)

+

+This function opens a file named filename and sets it as the +value of _OUTPUT. +Unlike the writeto operation, +this function does not erase any previous content of the file. +If this function fails, it returns nil, +plus a string describing the error. +

+Notice that function writeto is available to close an output file. +

+

remove (filename)

+

+This function deletes the file with the given name. +If this function fails, it returns nil, +plus a string describing the error. +

+

rename (name1, name2)

+

+This function renames file named name1 to name2. +If this function fails, it returns nil, +plus a string describing the error. +

+

tmpname ()

+

+This function returns a string with a file name that can safely +be used for a temporary file. +The file must be explicitly removed when no longer needed. +

+

read ([readpattern])

+

+This function reads the file _INPUT +according to a read pattern, that specifies how much to read; +characters are read from the current input file until +the read pattern fails or ends. +The function read returns a string with the characters read, +even if the pattern succeeds only partially, +or nil if the read pattern fails and +the result string would be empty. +When called without parameters, +it uses a default pattern that reads the next line +(see below). +

+A read pattern is a sequence of read pattern items. +An item may be a single character class +or a character class followed by ? or by *. +A single character class reads the next character from the input +if it belongs to the class, otherwise it fails. +A character class followed by ? reads the next character +from the input if it belongs to the class; +it never fails. +A character class followed by * reads until a character that +does not belong to the class, or end of file; +since it can match a sequence of zero characters, it never fails. +\footnote{ +Notice that the behavior of read patterns is different from +the regular pattern matching behavior, +where a * expands to the maximum length such that +the rest of the pattern does not fail. +With the read pattern behavior +there is no need for backtracking the reading. +} +

+A pattern item may contain sub-patterns enclosed in curly brackets, +that describe skips. +Characters matching a skip are read, +but are not included in the resulting string. +

+Following are some examples of read patterns and their meanings: +

    +
  • "." returns the next character, or nil on end of file. +
  • ".*" reads the whole file. +
  • "[^\n]*{\n}" returns the next line +(skipping the end of line), or nil on end of file. +This is the default pattern. +
  • "{%s*}%S%S*" returns the next word +(maximal sequence of non white-space characters), +skipping spaces if necessary, +or nil on end of file. +
  • "{%s*}[+-]?%d%d*" returns the next integer +or nil if the next characters do not conform to an integer format. +
+

+

write (value1, ...)

+

+This function writes the value of each of its arguments to the +file _OUTPUT. +The arguments must be strings or numbers. +To write other values, +use tostring or format before write. +If this function fails, it returns nil, +plus a string describing the error. +

+

date ([format])

+

+This function returns a string containing date and time +formatted according to the given string format, +following the same rules of the ANSI C function strftime. +When called without arguments, +it returns a reasonable date and time representation that depends on +the host system. +

+

exit ([code])

+

+This function calls the C function exit, +with an optional code, +to terminate the program. +The default value for code is 1. +

+

getenv (varname)

+

+Returns the value of the environment variable varname, +or nil if the variable is not defined. +

+

execute (command)

+

+This function is equivalent to the C function system. +It passes command to be executed by an operating system shell. +It returns an error code, which is system-dependent. +

+

+ + +


+ +

7 - The Debugger Interface

+

+Lua has no built-in debugging facilities. +Instead, it offers a special interface, +by means of functions and hooks, +which allows the construction of different +kinds of debuggers, profilers, and other tools +that need ``inside information'' from the interpreter. +This interface is declared in the header file luadebug.h. +

+ +

7.1 - Stack and Function Information

+

+The main function to get information about the interpreter stack +is +

+lua_Function lua_stackedfunction (int level); + +It returns a handle (lua_Function) to the activation record +of the function executing at a given level. +Level 0 is the current running function, +while level n+1 is the function that has called level n. +When called with a level greater than the stack depth, +lua_stackedfunction returns LUA_NOOBJECT. +

+The type lua_Function is just another name +to lua_Object. +Although, in this library, +a lua_Function can be used wherever a lua_Object is required, +when a parameter has type lua_Function +it accepts only a handle returned by +lua_stackedfunction. +

+Three other functions produce extra information about a function: +

+void lua_funcinfo (lua_Object func, char **filename, int *linedefined); +int lua_currentline (lua_Function func); +char *lua_getobjname (lua_Object o, char **name); + +lua_funcinfo gives the file name and the line where the +given function has been defined. +If the ``function'' is in fact the main code of a chunk, +then linedefined is 0. +If the function is a C function, +then linedefined is -1, and filename is "(C)". +

+The function lua_currentline gives the current line where +a given function is executing. +It only works if the function has been compiled with debug +information (see Section 4.9). +When no line information is available, it returns -1. +

+Function lua_getobjname tries to find a reasonable name for +a given function. +Because functions in Lua are first class values, +they do not have a fixed name: +Some functions may be the value of many global variables, +while others may be stored only in a table field. +Function lua_getobjname first checks whether the given +function is a tag method. +If so, it returns the string "tag-method", +and name is set to point to the event name. +Otherwise, if the given function is the value of a global variable, +then lua_getobjname returns the string "global", +and name points to the variable name. +If the given function is neither a tag method nor a global variable, +then lua_getobjname returns the empty string, +and name is set to NULL. +

+ +

7.2 - Manipulating Local Variables

+

+The following functions allow the manipulation of the +local variables of a given activation record. +They only work if the function has been compiled with debug +information (see Section 4.9). +

+lua_Object lua_getlocal (lua_Function func, int local_number, char **name); +int lua_setlocal (lua_Function func, int local_number); + +lua_getlocal returns the value of a local variable, +and sets name to point to the variable name. +local_number is an index for local variables. +The first parameter has index 1, and so on, until the +last active local variable. +When called with a local_number greater than the +number of active local variables, +or if the activation record has no debug information, +lua_getlocal returns LUA_NOOBJECT. +Formal parameters are the first local variables. +

+The function lua_setlocal sets the local variable +local_number to the value previously pushed on the stack +(see Section 5.1). +If the function succeeds, then it returns 1. +If local_number is greater than the number +of active local variables, +or if the activation record has no debug information, +then this function fails and returns 0. +

+ +

7.3 - Hooks

+

+The Lua interpreter offers two hooks for debugging purposes: +

+typedef void (*lua_CHFunction) (lua_Function func, char *file, int line); +extern lua_CHFunction lua_callhook; +

+typedef void (*lua_LHFunction) (int line); +extern lua_LHFunction lua_linehook; +

+The first one is called whenever the interpreter enters or leaves a +function. +When entering a function, +its parameters are a handle to the function activation record, +plus the file and the line where the function is defined (the same +information which is provided by lua_funcinfo); +when leaving a function, func is LUA_NOOBJECT, +file is "(return)", and line is 0. +

+The other hook is called every time the interpreter changes +the line of code it is executing. +Its only parameter is the line number +(the same information which is provided by the call +lua_currentline(lua_stackedfunction(0))). +This second hook is only called if the active function +has been compiled with debug information (see Section 4.9). +

+A hook is disabled when its value is NULL, +which is the initial value of both hooks. +

+

+

+ + +


+ +

8 - Lua Stand-alone

+

+Although Lua has been designed as an extension language, +the language can also be used as a stand-alone interpreter. +An implementation of such an interpreter, +called simply lua, +is provided with the standard distribution. +This program can be called with any sequence of the following arguments: +

+
-v
prints version information. +
-
runs interactively, accepting commands from standard input +until an EOF. +
-e stat
executes stat as a Lua chunk. +
var=exp
executes var=exp as a Lua chunk. +
filename
executes file filename as a Lua chunk. +
+All arguments are handled in order. +For instance, an invocation like ++$ lua - a=1 prog.lua + +will first interact with the user until an EOF, +then will set a to 1, +and finally will run file prog.lua. +

+Please notice that the interaction with the shell may lead to +unintended results. +For instance, a call like +

+$ lua a="name" prog.lua + +will not set a to the string "name". +Instead, the quotes will be handled by the shell, +lua will get only a=name to run, +and a will finish with nil, +because the global variable name has not been initialized. +Instead, one should write ++$ lua 'a="name"' prog.lua + +

+


+ +

Acknowledgments

+

+The authors would like to thank CENPES/PETROBRAS which, +jointly with TeCGraf, used extensively early versions of +this system and gave valuable comments. +The authors would also like to thank Carlos Henrique Levy, +who found the name of the game. +Lua means moon in Portuguese. +

+

+

+

+


+ +

Incompatibilities with Previous Versions

+

+Although great care has been taken to avoid incompatibilities with +the previous public versions of Lua, +some differences had to be introduced. +Here is a list of all these incompatibilities. +

+

Incompatibilities with version 2.5

+
    +
  • +The whole fallback mechanism has been replaced by tag methods. +Nevertheless, the function setfallback has been rewritten in +a way that uses tag methods to fully emulate the old behavior +of fallbacks. +
  • +Tags now must be created with the function newtag. +Nevertheless, old user defined tags are still accepted +(user defined tags must be positive; +newtag uses negative numbers). +Tag methods cannot be set for such user defined tags, +and fallbacks do not affect tags created by newtag. +
  • +Lua 2.5 accepts mixed comparisons of strings and numbers, +like 2<"12", giving weird results. +Now this is an error. +
  • +Character "-" (hyphen) now is ``magic'' in pattern matching. +
  • +Some API functions have been rewritten as macros. +
+

+

Incompatibilities with version 2.4

+The whole I/O facilities have been rewritten. +We strongly encourage programmers to adapt their code +to this new version. +The incompatibilities between the new and the old libraries are: +
    +
  • The format facility of function write has been supersed by +function format; +therefore this facility has been dropped. +
  • Function read now uses read patterns to specify +what to read; +this is incompatible with the old format options. +
  • Function strfind now accepts patterns, +so it may have a different behavior when the pattern includes +special characters. +
+

+

Incompatibilities with version 2.2

+
    +
  • +Functions date and time (from iolib) +have been superseded by the new, more powerful version of function date. +
  • +Function append (from iolib) now returns 1 whenever it succeeds, +whether the file is new or not. +
  • +Function int2str (from strlib) has been superseded by new +function format, with parameter "%c". +
  • +The API lock mechanism has been superseded by the reference mechanism. +However, lua.h provides compatibility macros, +so there is no need to change programs. +
  • +The API function lua_pushliteral now is just a macro to +lua_pushstring. +
+

+

Incompatibilities with version 2.1

+
    +
  • +The function type now returns the string "function" +both for C and Lua functions. +Because Lua functions and C functions are compatible, +this behavior is usually more useful. +When needed, the second result of function type may be used +to distinguish between Lua and C functions. +
  • +A function definition only assigns the function value to the +given variable at execution time. +
+

+

Incompatibilities with version 1.1

+
    +
  • +The equality test operator now is denoted by ==, +instead of =. +
  • +The syntax for table construction has been greatly simplified. +The old @(size) has been substituted by {}. +The list constructor (formerly @[...]) and the record +constructor (formerly @{...}) now are both coded like +{...}. +When the construction involves a function call, +like in @func{...}, +the new syntax does not use the @. +More important, {\em a construction function must now +explicitly return the constructed table}. +
  • +The function lua_call no longer has the parameter nparam. +
  • +The function lua_pop is no longer available, +since it could lead to strange behavior. +In particular, +to access results returned from a Lua function, +the new macro lua_getresult should be used. +
  • +The old functions lua_storefield and lua_storeindexed +have been replaced by ++int lua_storesubscript (void); + +with the parameters explicitly pushed on the stack. +
  • +The functionality of the function lua_errorfunction has been +replaced by the fallback mechanism (see Section 4.9). +
  • +When calling a function from the Lua library, +parameters passed through the stack +must be pushed just before the corresponding call, +with no intermediate calls to Lua. +Special care should be taken with macros like +lua_getindexed and lua_getfield. +
+

+

+ +


+Last update: +Tue Jul 1 07:55:45 EST 1997 +by lhf. + + diff --git a/doc/refman.ps b/doc/refman.ps deleted file mode 100644 index 24896e0..0000000 --- a/doc/refman.ps +++ /dev/null @@ -1,7807 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software -%%Title: manual.dvi -%%Pages: 39 -%%PageOrder: Ascend -%%BoundingBox: 0 0 612 792 -%%DocumentPaperSizes: Letter -%%EndComments -%DVIPSCommandLine: /visgraf/pub/teTeX/bin/sun4/dvips manual -%DVIPSParameters: dpi=600, comments removed -%DVIPSSource: TeX output 1996.11.18:1940 -%%BeginProcSet: tex.pro -/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N -/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 -mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} -ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale -isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div -hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul -TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} -forall round exch round exch]setmatrix}N /@landscape{/isls true N}B -/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B -/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ -/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N -string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N -end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ -/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] -N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup -length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ -128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub -get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data -dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N -/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup -/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx -0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff -setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff -.1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} -if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup -length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ -cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin -0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul -add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict -/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook -known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X -/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for -65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 -0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V -{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 -getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} -ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false -RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 -false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform -round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg -rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail -{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} -B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ -4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ -p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p -a}B /bos{/SS save N}B /eos{SS restore}B end -%%EndProcSet -TeXDict begin 40258431 52099146 1000 600 600 (manual.dvi) -@start /Fa 7 115 df<000000FFF00000000FFFFF8000003FFFFFF00000FFFFFFFC0001 -FFFFFFFC0007FFFFFFFC000FFF803FF8001FFC0003F8003FF00000F8007FC000003800FF -8000001801FF0000000003FE0000000003FC0000000007FC0000000007F8000000000FF0 -000000000FF0000000001FE0000000001FE0000000003FC0000000003FC0000000003FC0 -000000007F80000000007F80000000007F80000000007F8000000000FF0000000000FF00 -00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00 -00000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000007F80 -000000007F80000000007F80000000007F80000000003FC0000000003FC0000000003FC0 -000000001FE0000000001FE0000000000FF0000000000FF00000000007F80000000007FC -0000000003FC0000000003FE0000000001FF0000000400FF8000000C007FC000003C003F -F000007C001FFC0001FE000FFF801FFE0007FFFFFFFE0001FFFFFFFC0000FFFFFFF00000 -3FFFFFC000000FFFFF00000000FFF0002F437AC03A>67 D<000000FFF000000007FFFF00 -00003FFFFFE00000FFFFFFF80001FFFFFFFE0007FFFFFFFE000FFF803FFE001FFC0003FC -003FF00000FC007FE000003C00FF8000001C01FF0000000C01FE0000000003FC00000000 -07FC0000000007F8000000000FF0000000000FF0000000001FE0000000001FE000000000 -3FC0000000003FC0000000003FC0000000007F80000000007F80000000007F8000000000 -7F8000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000 -FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF000007FFFF -FF000007FFFFFF000007FFFF7F800007FFFF7F800007FFFF7F800007FFFF7F800000007F -3FC00000007F3FC00000007F3FC00000007F1FE00000007F1FE00000007F0FF00000007F -0FF00000007F07F80000007F07FC0000007F03FC0000007F01FE0000007F01FF0000007F -00FF8000007F007FE000007F003FF000007F001FFC0001FF000FFF801FFF0007FFFFFFFF -0001FFFFFFFF0000FFFFFFFC00003FFFFFF0000007FFFF00000000FFF00030437AC03D> -71 D84 D<000FF80000FFFF0003FFFF800FFFFFE01FFFFFF01FFFFF -F01FF00FF81F8003FC1E0001FC180001FE100000FE000000FF0000007F0000007F000000 -7F0000007F0000007F0000007F0000007F00007FFF000FFFFF007FFFFF01FFFFFF07FFFF -FF0FFFF07F3FFC007F3FC0007F7F00007FFE00007FFC00007FFC00007FFC00007FFC0000 -FFFE0000FFFE0001FF7F8007FF7FE01FFF3FFFFFFF3FFFFFFF1FFFFF7F0FFFFC7F07FFF0 -7F01FF0000202B7CA92C>97 D<0003F80000001FFF0000007FFFC00000FFFFE00001FFFF -F00003FFFFF80007FE07F8000FF801FC000FE000FE001FC0007E003FC0003E003F80003F -003F00001F007F00001F007E00001F007E00000F80FFFFFFFF80FFFFFFFF80FFFFFFFF80 -FFFFFFFF80FFFFFFFF80FFFFFFFF80FC00000000FC00000000FC00000000FE000000007E -000000007E000000007F000000007F000000003F800000003F800000001FC00000001FE0 -0000800FF000038007FC001F8007FF00FF8003FFFFFF8001FFFFFF80007FFFFF00003FFF -FC00000FFFE0000001FF0000212B7DA928>101 D<00001FF00000FFFC0001FFFC0007FF -FC000FFFFC000FFFFC001FE03C003F8004003F0000007F0000007E000000FE000000FE00 -0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 -0000FE000000FE0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000FE00 -0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 -0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 -0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 -0000FE000000FE000000FE000000FE000000FE000000FE00001E407FBF1C>I114 D E /Fb 7 121 df<001FFC00000000FFFF -80000003FFFFE0000007FFFFF000000FFFFFFC00001FFFFFFE00001FF007FF00001FE001 -FF00001FE000FF80001FE0003F80000FC0003FC0000780001FC0000000001FE000000000 -0FE0000000000FE0000000000FE0000000000FE0000000000FE00000000FFFE0000001FF -FFE000001FFFFFE000007FFFFFE00001FFFFFFE00007FFFF0FE0000FFFC00FE0001FFC00 -0FE0003FF0000FE0007FC0000FE0007F80000FE000FF00000FE000FE00000FE000FE0000 -0FE000FE00000FE000FE00000FE000FE00000FE000FF00001FE0007F00001FE0007F8000 -7FE0003FE000FFF0003FF807FFFFF01FFFFFFFFFF80FFFFFFFFFF807FFFFF3FFF803FFFF -C1FFF800FFFF003FF0001FF00000002D2E7BAC33>97 D<0000FF80000007FFF000001FFF -FC00003FFFFE0000FFFFFF0001FFFFFF8003FF80FFC007FE003FE007F8000FF00FF00007 -F01FE00007F81FC00003F83FC00003FC3F800001FC7F800001FC7F000001FC7F000001FE -7F000000FEFF000000FEFE000000FEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFF -FFFFFFFEFFFFFFFFFCFE00000000FF000000007F000000007F000000007F000000003F80 -0000003F8000007C1FC00000FE1FE00000FE0FF00000FE0FF80001FE07FC0003FC03FF00 -0FFC01FFC03FF800FFFFFFF0007FFFFFE0003FFFFFC0000FFFFF000003FFFC0000007FE0 -00272E7BAC33>101 D<000001FF00003FFC07FFC0007FFE1FFFF000FFFE7FFFF800FFFE -FFFFF8007FFFFFFFFC003FFFFF07FE0000FFF801FE0000FFF000FE0000FFE000FF0000FF -C0007F0000FF80007F0000FF80007F0000FF00007F0000FF00007F0000FF00007F0000FE -00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE -00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE -00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE -00007F0000FE00007F0000FE00007F0000FE00007F003FFFF80FFFFC7FFFFC1FFFFEFFFF -FE3FFFFFFFFFFE3FFFFF7FFFFC1FFFFE3FFFF80FFFFC302C7FAB33>110 -D<00000003FE007FFF801FFF80FFFFC07FFFE0FFFFC1FFFFE0FFFFC3FFFFF0FFFFC7FFFF -F07FFFCFFE0FF0001FDFF00FF0001FFFC007E0001FFF8003C0001FFF000000001FFE0000 -00001FFC000000001FF8000000001FF8000000001FF0000000001FF0000000001FE00000 -00001FE0000000001FE0000000001FC0000000001FC0000000001FC0000000001FC00000 -00001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC00000 -00001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC00000 -00001FC0000000001FC00000007FFFFFFE0000FFFFFFFF0000FFFFFFFF0000FFFFFFFF00 -00FFFFFFFF00007FFFFFFE00002C2C7DAB33>114 D<0003C00000000007E0000000000F -E0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000F -E0000000000FE0000000000FE0000000000FE00000003FFFFFFFFC007FFFFFFFFE00FFFF -FFFFFE00FFFFFFFFFE00FFFFFFFFFE007FFFFFFFFC00000FE0000000000FE0000000000F -E0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000F -E0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000F -E0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000F -E0000000000FE0001F00000FE0003F80000FE0003F80000FE0003F80000FE0003F80000F -E0003F80000FE0007F80000FF0007F000007F000FF000007F801FF000007FE07FE000003 -FFFFFC000001FFFFF8000000FFFFF00000007FFFE00000001FFF8000000007FC00002938 -7EB633>116 D<3FFFC00FFFF07FFFE01FFFF8FFFFF03FFFFCFFFFF03FFFFC7FFFE01FFF -F83FFFC00FFFF001F800007E0001FC0000FE0000FC0000FC0000FC0000FC0000FE0001FC -00007E0001F800007E0001F800007F0003F800003F0003F000003F0003F000003F8007F0 -00001F8007E000001F8007E000001FC00FE000000FC00FC000000FC00FC000000FC00FC0 -000007E01F80000007E01F80000007E01F80000007F03F80000003F03F00000003F03F00 -000003F87F00000001F87E00000001F87E00000001FCFE00000000FCFC00000000FCFC00 -000000FFFC000000007FF8000000007FF8000000007FF8000000003FF0000000003FF000 -0000001FE0000000000FC000002E2B7EAA33>118 D<3FFFC07FFF807FFFE0FFFFC0FFFF -F1FFFFE0FFFFF1FFFFE07FFFE0FFFFC03FFFC07FFF8000FE000FE000007F001FC000003F -801FC000003F803F8000001FC07F0000000FE07E00000007F0FE00000007F1FC00000003 -FBF800000001FFF800000000FFF000000000FFE0000000007FC0000000003FC000000000 -1F80000000003F80000000003FC0000000007FE000000000FFE000000001FBF000000001 -F9F800000003F1FC00000007E0FC00000007E07E0000000FC07F0000001FC03F8000003F -801F8000003F001FC000007F000FE00000FE0007F00001FC0003F0007FFFC03FFFE0FFFF -E07FFFF0FFFFE07FFFF0FFFFE07FFFF0FFFFE07FFFF07FFFC03FFFE02C2B7DAA33>120 -D E /Fc 1 43 df<000F0000001F8000001F8000001F8000001F8000001F8000001F8000 -781F81E0FE1F87F0FF1F8FF0FFDFBFF07FFFFFE03FFFFFC00FFFFF0003FFFC0000FFF000 -00FFF00003FFFC000FFFFF003FFFFFC07FFFFFE0FFDFBFF0FF1F8FF0FE1F87F0781F81E0 -001F8000001F8000001F8000001F8000001F8000001F8000000F00001C207BA627>42 -D E /Fd 1 122 df<01E0000007F8000E0E3C001F1C3E003F383E003E303E003E703E00 -3E607E007EE07C007CC07C007CC0FC007C80F800FC00F800F801F800F801F000F801F001 -F803F001F003E001F003E001F003E003F007E003E007C003E007C003E007C007E007C007 -C003C00FC003E01FC003E03FC001F07F80007FEF80001F8F8000001F8000001F0000001F -003E003E003E003E007E007C007E00F8007C01F0007003E0003007C0003C0F80000FFE00 -0003F00000202C7E9D23>121 D E /Fe 3 121 df<1E007F80FF80FFC0FFC0FFE0FFE0FF -E07FE01E60006000600060006000E000C000C000C001C001800380030007000E001C0018 -00380030000B1C798919>59 D<01F0000FF0000007FC003FFE00000F1F00F01F00000E1F -03C00F80001E0F87000FC0001C0F8E0007C0003C0FDC0007E000380FF80007E000380FF0 -0007E000781FF00007E000701FE00007E000701FC00007E000701FC00007E000F01F8000 -0FE000F03F80000FC000003F00000FC000003F00000FC000003F00001FC000007F00001F -8000007E00001F8000007E00003F8000007E00003F000000FE00003F000000FC00007F00 -0000FC00007E000000FC00007E000001FC0000FE038001F80000FC038001F80000FC0380 -01F80001FC078003F80001F8070003F00001F8070003F00001F80F0003F00001F00E0007 -F00001F01E0007E00001F01C0007E00001F0380007E00001F078000FE00000F8F0000FC0 -00007FC000038000001F000031297EA737>110 D<0001F8003F000007FE00FFE0001E0F -83C0F0003807C780F8007003CF03F800E003FE03F801C003FC07F803C003FC07F8038003 -F807F8070003F807F0070003F801C00E0003F000000E0003F000001E0007F000001E0007 -F00000000007E00000000007E0000000000FE0000000000FC0000000000FC0000000000F -C0000000001FC0000000001F80000000001F80000000001F80000000003F80000000003F -0001C000003F0001C000003F0001C000007F0003C01E007F0003803F007E0007807F80FE -0007007F80FE000F00FF81FE001E00FF01DF001C00FE03DF0038007C078F80F0003C0F07 -C1E0001FFC03FF800007F0007E00002D297EA734>120 D E /Ff -51 121 df<0000000FFF0000000001FFFFC00000000FFFFFF00000007FFFFFF8000001FF -F803FC000003FFC000FE00000FFF0003FE00001FFE0007FF00003FFC000FFF00003FF800 -0FFF00007FF0000FFF00007FF0001FFF8000FFF0000FFF0000FFE0000FFF0000FFE0000F -FF0000FFE0000FFF0000FFE00007FE0000FFE00001F80000FFE00000000000FFE0000000 -0000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE000000000 -00FFE001FFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FF -FFFFFFFFFF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FF -E00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE0 -0003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE000 -03FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003 -FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF -8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF80 -00FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF807FFFFFC1FFFFFF7F -FFFFC1FFFFFF7FFFFFC1FFFFFF7FFFFFC1FFFFFF7FFFFFC1FFFFFF38467EC53E>12 -D<07C01FF03FF87FFCFFFEFFFEFFFEFFFEFFFEFFFEFFFE7FFC3FF81FF007C00F0F788E1F ->46 D<0000000001C00000000003E00000000007E00000000007E0000000000FE0000000 -000FC0000000001FC0000000001F80000000001F80000000003F80000000003F00000000 -007F00000000007E00000000007E0000000000FE0000000000FC0000000001FC00000000 -01F80000000001F80000000003F80000000003F00000000003F00000000007F000000000 -07E0000000000FE0000000000FC0000000000FC0000000001FC0000000001F8000000000 -3F80000000003F00000000003F00000000007F00000000007E0000000000FE0000000000 -FC0000000000FC0000000001FC0000000001F80000000003F80000000003F00000000003 -F00000000007F00000000007E0000000000FE0000000000FC0000000000FC0000000001F -C0000000001F80000000003F80000000003F00000000003F00000000007F00000000007E -00000000007E0000000000FE0000000000FC0000000001FC0000000001F80000000001F8 -0000000003F80000000003F00000000007F00000000007E00000000007E0000000000FE0 -000000000FC0000000001FC0000000001F80000000001F80000000003F80000000003F00 -000000007F00000000007E00000000007E0000000000FE0000000000FC0000000001FC00 -00000001F80000000001F80000000003F80000000003F00000000003F00000000007F000 -00000007E0000000000FE0000000000FC0000000000FC0000000001FC0000000001F8000 -0000003F80000000003F00000000003F00000000007F00000000007E0000000000FE0000 -000000FC0000000000FC0000000000F800000000007800000000002B647ACA38>I<0000 -3FF800000001FFFF0000000FFFFFE000003FFFFFF800007FF01FFC0000FFC007FE0001FF -0001FF0003FE0000FF8007FE0000FFC007FC00007FC00FFC00007FE00FF800003FE01FF8 -00003FF01FF800003FF03FF800003FF83FF800003FF83FF000001FF87FF000001FFC7FF0 -00001FFC7FF000001FFC7FF000001FFC7FF000001FFC7FF000001FFCFFF000001FFEFFF0 -00001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF0 -00001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF0 -00001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF0 -00001FFEFFF000001FFE7FF000001FFC7FF000001FFC7FF000001FFC7FF000001FFC7FF0 -00001FFC3FF800003FF83FF800003FF83FF800003FF81FF800003FF01FF800003FF00FF8 -00003FE00FFC00007FE007FC00007FC007FE0000FFC003FF0001FF8001FF8003FF0000FF -C007FE00007FF01FFC00003FFFFFF800000FFFFFE0000003FFFF800000003FF800002F42 -7CC038>I<000003C000000007C00000001FC00000007FC0000003FFC000003FFFC000FF -FFFFC000FFFFFFC000FFFFFFC000FFFFFFC000FFC3FFC0000003FFC0000003FFC0000003 -FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FF -C0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0 -000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC000 -0003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC00000 -03FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003 -FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FF -C0000003FFC0000003FFC0000003FFC000FFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFFFFFFF -FCFFFFFFFFFC264177C038>I<0000FFE00000000FFFFE0000003FFFFF800000FFFFFFE0 -0003FFFFFFF80007FC03FFFE000FE0007FFF001F80003FFF803F00000FFFC07F000007FF -C07FC00007FFE07FF00003FFE0FFF00001FFF0FFF80001FFF0FFF80001FFF8FFF80000FF -F8FFF80000FFF8FFF80000FFF8FFF80000FFF87FF00000FFF83FE00000FFF81FC00000FF -F800000000FFF800000000FFF000000001FFF000000001FFF000000001FFE000000003FF -E000000003FFC000000007FF800000000FFF000000000FFF000000001FFC000000003FF8 -000000003FF0000000007FE000000000FFC000000001FF0000000003FE0000000007FC00 -0000000FF0000000001FE0000000003F80000000007F0000780000FE0000780001FC0000 -780003F80000F80007E00000F0000FC00000F0001F800000F0003F000000F0007C000001 -F000F8000003F001FFFFFFFFF003FFFFFFFFE007FFFFFFFFE00FFFFFFFFFE01FFFFFFFFF -E03FFFFFFFFFE07FFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFF -C0FFFFFFFFFFC02D417BC038>I<0000FFF000000007FFFF0000001FFFFFC000007FFFFF -F00000FF007FF80003F8003FFE0007E0001FFF0007E0000FFF000FF80007FF800FFE0007 -FF801FFE0007FFC01FFF0007FFC01FFF0007FFC01FFF0007FFC01FFF0007FFC01FFF0007 -FFC01FFF0007FFC00FFE0007FFC007FC0007FF8003F8000FFF800000000FFF000000001F -FF000000001FFE000000003FFC000000007FF800000000FFF000000001FFE00000000FFF -80000007FFFE00000007FFF800000007FFFF00000007FFFFC000000000FFF0000000003F -FC000000000FFE000000000FFF8000000007FF8000000003FFC000000003FFE000000003 -FFE000000001FFF000000001FFF000000001FFF800000001FFF800000001FFF80FC00001 -FFF83FF00001FFF87FF80001FFF87FF80001FFF8FFFC0001FFF8FFFC0001FFF8FFFC0001 -FFF0FFFC0001FFF0FFFC0003FFF0FFFC0003FFE07FF80003FFE07FF00007FFC07FE00007 -FFC03F80000FFF801FF0001FFF000FFE00FFFE0007FFFFFFF80001FFFFFFF000007FFFFF -C000001FFFFE00000001FFE000002D427BC038>I<000000003F0000000000003F000000 -0000007F000000000000FF000000000001FF000000000003FF000000000003FF00000000 -0007FF00000000000FFF00000000001FFF00000000003FFF00000000003FFF0000000000 -7FFF0000000000FFFF0000000001F7FF0000000003E7FF0000000007E7FF0000000007C7 -FF000000000F87FF000000001F07FF000000003E07FF000000007E07FF000000007C07FF -00000000F807FF00000001F007FF00000003E007FF00000007E007FF00000007C007FF00 -00000F8007FF0000001F0007FF0000003E0007FF0000007C0007FF0000007C0007FF0000 -00F80007FF000001F00007FF000003E00007FF000007C00007FF00000FC00007FF00000F -800007FF00001F000007FF00003E000007FF00007C000007FF0000FC000007FF0000FFFF -FFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80000000 -0FFF00000000000FFF00000000000FFF00000000000FFF00000000000FFF00000000000F -FF00000000000FFF00000000000FFF00000000000FFF00000000000FFF00000000000FFF -00000000000FFF000000007FFFFFFF8000007FFFFFFF8000007FFFFFFF8000007FFFFFFF -8000007FFFFFFF8031417DC038>I<07000000030007E000003F0007FF0007FF0007FFFF -FFFF0007FFFFFFFE0007FFFFFFFC0007FFFFFFF80007FFFFFFF00007FFFFFFE00007FFFF -FF800007FFFFFE000007FFFFFC000007FFFFE0000007FFFF00000007C00000000007C000 -00000007C00000000007C00000000007C00000000007C00000000007C00000000007C000 -00000007C00000000007C00000000007C03FF0000007C1FFFF000007C7FFFFC00007DFFF -FFF00007FFE03FFC0007FF000FFE0007FC0007FF0007F00003FF8007E00003FFC007C000 -01FFC003800001FFE000000001FFE000000000FFF000000000FFF000000000FFF0000000 -00FFF800000000FFF800000000FFF800000000FFF80F800000FFF83FE00000FFF87FF000 -00FFF8FFF00000FFF8FFF80000FFF8FFF80000FFF8FFF80000FFF8FFF80000FFF0FFF000 -00FFF0FFF00001FFF07FE00001FFE07FC00001FFE07E000003FFC03E000003FFC03F0000 -07FF801FC0000FFF000FF0001FFE0007FE00FFFC0003FFFFFFF00000FFFFFFE000003FFF -FF8000000FFFFC00000001FFC000002D427BC038>I<000001FF800000001FFFF0000000 -7FFFFC000001FFFFFF000007FF807F80000FFC001F80003FF0001FC0007FE0007FC000FF -C000FFE001FF8001FFE003FF8001FFE003FF0001FFE007FE0001FFE00FFE0001FFE00FFE -0001FFE01FFC0000FFC01FFC00007F801FFC00001E003FFC000000003FFC000000003FF8 -000000007FF8000000007FF8000000007FF807FC00007FF81FFF8000FFF87FFFE000FFF8 -FFFFF800FFF9F01FFC00FFFBC007FE00FFFF8003FF00FFFF8003FF80FFFF0001FFC0FFFE -0001FFC0FFFE0000FFE0FFFE0000FFE0FFFC0000FFF0FFFC0000FFF0FFFC0000FFF0FFFC -0000FFF8FFF80000FFF8FFF80000FFF8FFF80000FFF8FFF80000FFF87FF80000FFF87FF8 -0000FFF87FF80000FFF87FF80000FFF87FF80000FFF83FF80000FFF83FF80000FFF83FF8 -0000FFF03FFC0000FFF01FFC0000FFF01FFC0000FFF00FFC0001FFE00FFC0001FFE007FE -0001FFC007FF0003FF8003FF8003FF0001FFC007FE0000FFE01FFC00007FFFFFF800001F -FFFFF0000007FFFFC0000001FFFF000000003FF000002D427BC038>I<1E00000000001F -00000000001FFC000000001FFFFFFFFFFE1FFFFFFFFFFE1FFFFFFFFFFE1FFFFFFFFFFE3F -FFFFFFFFFE3FFFFFFFFFFC3FFFFFFFFFF83FFFFFFFFFF03FFFFFFFFFE03FFFFFFFFFC03F -FFFFFFFFC07FFFFFFFFF807E0000003F007C0000007E007C000000FC0078000000F80078 -000001F80078000003F000F8000007E000F000000FC000F000000F8000F000001F800000 -00003F00000000007E0000000000FC0000000000FC0000000001F80000000003F8000000 -0003F00000000007F0000000000FE0000000000FE0000000001FE0000000001FC0000000 -003FC0000000003FC0000000007FC0000000007F8000000000FF8000000000FF80000000 -01FF8000000001FF8000000001FF8000000003FF8000000003FF0000000003FF00000000 -03FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000000 -0FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF00000000 -0FFF000000000FFF000000000FFF000000000FFF0000000007FE0000000003FC00000000 -01F80000002F447AC238>I<00007FF000000003FFFF0000000FFFFFC000003FFFFFF000 -007F801FFC0001FC0003FE0003F80001FF0003F00000FF0007E000007F8007E000003F80 -0FC000003FC00FC000003FC01FC000001FC01FC000001FC01FE000001FC01FE000001FC0 -1FF000001FC01FF800001FC01FFE00003FC01FFF00003F801FFFC0007F801FFFF0007F00 -0FFFFC00FF000FFFFE01FE0007FFFF83FC0007FFFFE7F80003FFFFFFE00001FFFFFFC000 -00FFFFFF0000007FFFFFC000003FFFFFE000000FFFFFF800000FFFFFFC00003FFFFFFE00 -00FFFFFFFF0001FF3FFFFF8007FC0FFFFFC00FF803FFFFE01FF000FFFFE01FE0007FFFF0 -3FE0001FFFF07FC00007FFF07F800003FFF87F800000FFF8FF8000007FF8FF0000003FF8 -FF0000001FF8FF0000000FF8FF0000000FF8FF00000007F8FF00000007F8FF00000007F8 -FF80000007F07F80000007F07F8000000FF07FC000000FE03FE000001FE03FF000003FC0 -1FF800007F800FFE0001FF0007FFC00FFE0003FFFFFFFC0000FFFFFFF000003FFFFFC000 -000FFFFF00000000FFF000002D427BC038>I<00007FF000000007FFFE0000001FFFFF80 -00007FFFFFE00000FFE03FF00001FF800FF80003FF0007FC0007FE0007FE000FFC0003FF -001FFC0001FF003FFC0001FF803FFC0001FF807FF80001FFC07FF80000FFC07FF80000FF -E07FF80000FFE0FFF80000FFE0FFF80000FFF0FFF80000FFF0FFF80000FFF0FFF80000FF -F0FFF80000FFF0FFF80000FFF0FFF80000FFF8FFF80000FFF8FFF80000FFF8FFF80000FF -F8FFF80001FFF87FF80001FFF87FF80001FFF87FF80001FFF83FF80003FFF83FF80003FF -F81FFC0003FFF81FFC0007FFF80FFE000FFFF807FE000FFFF803FF001EFFF801FFC07CFF -F800FFFFF8FFF8003FFFF0FFF8000FFFC0FFF00001FF00FFF000000000FFF000000000FF -F000000000FFE000000001FFE000000001FFE003C00001FFE00FF00001FFC01FF80001FF -C03FFC0003FF803FFC0003FF803FFC0003FF003FFC0007FE003FFC000FFE003FFC000FFC -003FF8001FF8001FF0003FF0001FC000FFE0000FF003FFC00007FFFFFF800003FFFFFE00 -0001FFFFF80000007FFFE000000007FE0000002D427BC038>I<000000001F8000000000 -000000001F8000000000000000003FC000000000000000003FC000000000000000007FE0 -00000000000000007FE000000000000000007FE00000000000000000FFF0000000000000 -0000FFF00000000000000001FFF80000000000000001FFF80000000000000001FFF80000 -000000000003FFFC0000000000000003FFFC0000000000000007FFFE0000000000000007 -FFFE0000000000000007FFFE000000000000000FFFFF000000000000000F9FFF00000000 -0000001F9FFF800000000000001F1FFF800000000000001F0FFF800000000000003F0FFF -C00000000000003E07FFC00000000000007E07FFE00000000000007C07FFE00000000000 -007C03FFE0000000000000FC03FFF0000000000000F801FFF0000000000001F801FFF800 -0000000001F001FFF8000000000001F000FFF8000000000003F000FFFC000000000003E0 -007FFC000000000007E0007FFE000000000007C0007FFE000000000007C0003FFE000000 -00000FC0003FFF00000000000F80001FFF00000000001F80001FFF80000000001F00000F -FF80000000001F00000FFF80000000003F00000FFFC0000000003E000007FFC000000000 -7E000007FFE0000000007FFFFFFFFFE0000000007FFFFFFFFFE000000000FFFFFFFFFFF0 -00000000FFFFFFFFFFF000000001FFFFFFFFFFF800000001F0000000FFF800000001F000 -0000FFF800000003F0000000FFFC00000003E00000007FFC00000007E00000007FFE0000 -0007C00000003FFE00000007C00000003FFE0000000F800000003FFF0000000F80000000 -1FFF0000001F800000001FFF8000001F000000000FFF8000003F000000000FFFC000003E -000000000FFFC000007E0000000007FFC000FFFFFF00000FFFFFFFF0FFFFFF00000FFFFF -FFF0FFFFFF00000FFFFFFFF0FFFFFF00000FFFFFFFF0FFFFFF00000FFFFFFFF04C457CC4 -55>65 D<00000000FFF00000700000001FFFFF0000F0000001FFFFFFE001F0000007FFFF -FFF803F000003FFFFFFFFE07F00000FFFFE001FF0FF00001FFFE00003F9FF00007FFF000 -000FFFF0000FFFC0000007FFF0001FFF00000003FFF0003FFE00000001FFF0007FFC0000 -0000FFF000FFF8000000007FF001FFF0000000003FF003FFE0000000001FF007FFE00000 -00001FF007FFC0000000000FF00FFF80000000000FF00FFF800000000007F01FFF000000 -000007F01FFF000000000003F03FFF000000000003F03FFE000000000003F03FFE000000 -000003F07FFE000000000001F07FFE000000000001F07FFE000000000001F07FFC000000 -00000000FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC000000 -00000000FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC000000 -00000000FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC000000 -00000000FFFC00000000000000FFFC000000000000007FFC000000000000007FFE000000 -000000007FFE000000000000F07FFE000000000000F03FFE000000000000F03FFE000000 -000000F03FFF000000000000F01FFF000000000001F01FFF000000000001E00FFF800000 -000001E00FFF800000000003E007FFC00000000003C007FFE00000000007C003FFE00000 -000007C001FFF0000000000F8000FFF8000000001F00007FFC000000003F00003FFE0000 -00007E00001FFF80000000FC00000FFFC0000001F8000007FFF0000007F0000001FFFE00 -001FE0000000FFFFF001FF800000003FFFFFFFFF0000000007FFFFFFFC0000000001FFFF -FFF000000000001FFFFF80000000000000FFF800000044467AC451>67 -DIII72 DI76 DI<00000007FFC0000000000000FFFFFE0000000000 -07FFFFFFC0000000001FFFFFFFF0000000007FFE00FFFC00000001FFF0001FFF00000007 -FF800003FFC000000FFF000001FFE000001FFC0000007FF000003FF80000003FF800007F -F00000001FFC0000FFF00000001FFE0001FFE00000000FFF0003FFC000000007FF8003FF -C000000007FF8007FF8000000003FFC007FF8000000003FFC00FFF0000000001FFE00FFF -0000000001FFE01FFF0000000001FFF01FFE0000000000FFF03FFE0000000000FFF83FFE -0000000000FFF83FFE0000000000FFF87FFE0000000000FFFC7FFC00000000007FFC7FFC -00000000007FFC7FFC00000000007FFC7FFC00000000007FFCFFFC00000000007FFEFFFC -00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC -00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC -00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFE7FFC -00000000007FFC7FFE0000000000FFFC7FFE0000000000FFFC7FFE0000000000FFFC3FFE -0000000000FFF83FFE0000000000FFF83FFF0000000001FFF81FFF0000000001FFF01FFF -0000000001FFF01FFF8000000003FFF00FFF8000000003FFE00FFF8000000003FFE007FF -C000000007FFC003FFC000000007FF8003FFE00000000FFF8001FFF00000001FFF0000FF -F80000003FFE00007FFC0000007FFC00003FFE000000FFF800001FFF000001FFF000000F -FFC00007FFE0000007FFF0001FFFC0000001FFFE00FFFF00000000FFFFFFFFFE00000000 -3FFFFFFFF80000000007FFFFFFC00000000000FFFFFE00000000000007FFC00000004746 -7AC454>79 DI82 D<0000FFE0001C000007 -FFFE003C00003FFFFF807C0000FFFFFFE0FC0001FFFFFFF9FC0003FF801FFFFC0007FC00 -01FFFC000FF800007FFC001FF000003FFC003FE000000FFC003FC0000007FC007FC00000 -03FC007F80000003FC007F80000001FC007F80000000FC00FF80000000FC00FF80000000 -7C00FF800000007C00FFC00000007C00FFC00000007C00FFE00000003C00FFF00000003C -00FFF80000003C00FFFC00000000007FFE00000000007FFFE0000000007FFFFE00000000 -3FFFFFF00000003FFFFFFF0000001FFFFFFFE000001FFFFFFFFC00000FFFFFFFFE000007 -FFFFFFFF800003FFFFFFFFC00001FFFFFFFFE000007FFFFFFFF000001FFFFFFFF8000007 -FFFFFFFC000000FFFFFFFC0000000FFFFFFE00000000FFFFFE0000000007FFFF00000000 -007FFF00000000003FFF00000000000FFF800000000007FF800000000003FF80F0000000 -03FF80F000000001FF80F000000001FF80F000000000FF80F000000000FF80F800000000 -FF80F800000000FF80F800000000FF00FC00000000FF00FC00000000FF00FE00000001FF -00FF00000001FE00FF80000003FE00FFC0000003FC00FFE0000007FC00FFF800000FF800 -FFFF00003FF000FFFFF800FFE000FE7FFFFFFFC000FC1FFFFFFF0000F807FFFFFC0000F0 -00FFFFF00000E00007FF80000031467AC43E>I<3FFFFFFFFFFFFFFFE03FFFFFFFFFFFFF -FFE03FFFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFE000FFF8003 -FFE07FE0000FFF80003FF07FC0000FFF80001FF07F00000FFF800007F07F00000FFF8000 -07F07E00000FFF800003F07C00000FFF800001F07C00000FFF800001F07C00000FFF8000 -01F07800000FFF800000F07800000FFF800000F07800000FFF800000F07800000FFF8000 -00F0F800000FFF800000F8F000000FFF80000078F000000FFF80000078F000000FFF8000 -0078F000000FFF80000078F000000FFF800000780000000FFF800000000000000FFF8000 -00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 -00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 -00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 -00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 -00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 -00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 -00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 -00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 -00000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000 -00000007FFFFFFFFFF00000007FFFFFFFFFF00000007FFFFFFFFFF00000007FFFFFFFFFF -00000007FFFFFFFFFF000045437CC24E>I86 -D<0001FFE0000000001FFFFE000000007FFFFF80000001FFFFFFE0000003FE007FF80000 -07FC001FFC000007FE000FFE00000FFF0007FF00000FFF0007FF00000FFF0003FF80000F -FF0003FF80000FFF0003FF80000FFF0001FFC00007FE0001FFC00003FC0001FFC00000F0 -0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000003 -FFFFC0000000FFFFFFC0000007FFFFFFC000003FFFF1FFC00000FFFC01FFC00003FFE001 -FFC0000FFF8001FFC0001FFE0001FFC0003FFC0001FFC0003FF80001FFC0007FF80001FF -C0007FF00001FFC000FFF00001FFC000FFE00001FFC000FFE00001FFC000FFE00001FFC0 -00FFE00003FFC000FFE00003FFC000FFF00007FFC0007FF8000FFFC0007FF8001FFFF000 -3FFE003EFFFFC01FFF80FC7FFFC007FFFFF87FFFC003FFFFE01FFFC0007FFF8007FFC000 -0FFC00000000322F7DAD36>97 D<007FC000000000FFFFC000000000FFFFC000000000FF -FFC000000000FFFFC000000000FFFFC00000000003FFC00000000001FFC00000000001FF -C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0 -0000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000 -00000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000 -000001FFC00FF8000001FFC0FFFF800001FFC3FFFFE00001FFCFFFFFF80001FFDFC03FFC -0001FFFF000FFE0001FFFC0003FF0001FFF80001FF8001FFF00001FFC001FFE00000FFE0 -01FFC00000FFE001FFC000007FF001FFC000007FF001FFC000007FF801FFC000003FF801 -FFC000003FF801FFC000003FF801FFC000003FFC01FFC000003FFC01FFC000003FFC01FF -C000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC0 -00003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FF801FFC000 -003FF801FFC000007FF801FFC000007FF001FFC000007FF001FFC000007FF001FFC00000 -FFE001FFE00000FFC001FFF00001FFC001FFF80003FF8001FF7C0007FF0001FE3E000FFE -0001FC1FC07FFC0001F80FFFFFF00001F003FFFFC00001E000FFFF00000000001FF00000 -36467DC43E>I<00003FFC00000001FFFFC000000FFFFFF000003FFFFFFC00007FF003FE -0000FFC001FF0003FF8003FF0007FF0007FF8007FE0007FF800FFE0007FF801FFC0007FF -801FFC0007FF803FF80007FF803FF80003FF007FF80001FE007FF8000078007FF0000000 -007FF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF0000000 -00FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF0000000 -00FFF0000000007FF8000000007FF8000000007FF8000000003FF8000000003FFC000003 -C03FFC000003C01FFE000007C00FFE000007800FFF00000F8007FF80001F0003FFC0003E -0001FFF0007C00007FFC03F800003FFFFFF000000FFFFFC0000003FFFF000000003FF800 -002A2F7CAD32>I<0000000003FE0000000007FFFE0000000007FFFE0000000007FFFE00 -00000007FFFE0000000007FFFE00000000001FFE00000000000FFE00000000000FFE0000 -0000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE000000 -00000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000 -000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE0000003FE0 -0FFE000003FFFC0FFE00000FFFFF8FFE00003FFFFFCFFE0000FFF807FFFE0001FFC001FF -FE0003FF80007FFE0007FF00003FFE000FFE00001FFE000FFC00000FFE001FFC00000FFE -003FF800000FFE003FF800000FFE003FF800000FFE007FF800000FFE007FF000000FFE00 -7FF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FF -F000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF0 -00000FFE00FFF000000FFE00FFF000000FFE007FF000000FFE007FF000000FFE007FF000 -000FFE007FF800000FFE003FF800000FFE003FF800000FFE001FFC00001FFE001FFC0000 -1FFE000FFE00003FFE0007FE00007FFE0003FF0000FFFF0001FFC003FFFFFC00FFF01FEF -FFFC007FFFFF8FFFFC001FFFFE0FFFFC0007FFF80FFFFC00007FC00FF80036467CC43E> -I<00003FF800000003FFFF8000000FFFFFE000003FFFFFF000007FF83FF80000FFC007FC -0001FF8003FE0003FF0001FF0007FE0000FF800FFC0000FF801FFC00007FC01FF800007F -C03FF800003FE03FF800003FE07FF800003FE07FF000003FE07FF000003FF07FF000001F -F0FFF000001FF0FFF000001FF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFF -F0FFF000000000FFF000000000FFF000000000FFF000000000FFF0000000007FF0000000 -007FF0000000007FF8000000007FF8000000003FF8000000003FF8000000F01FFC000000 -F01FFC000001F00FFE000001E007FF000003E003FF800007C001FFC0000F8000FFF0003F -00007FFE01FE00001FFFFFFC000007FFFFF0000001FFFFC00000001FFE00002C2F7DAD33 ->I<000000FF8000000FFFE000007FFFF00001FFFFF80003FF8FFC000FFE0FFE001FFC1F -FE001FF81FFE003FF81FFE007FF01FFE007FF01FFE007FF00FFC00FFE00FFC00FFE003F0 -00FFE000C000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 -FFE0000000FFE0000000FFE0000000FFE0000000FFE00000FFFFFFF800FFFFFFF800FFFF -FFF800FFFFFFF800FFFFFFF80000FFE0000000FFE0000000FFE0000000FFE0000000FFE0 -000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 -0000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000 -00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 -FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF -E000007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE00027467DC522>I<00 -00FFE0007E00000FFFFE03FF80003FFFFF8FFF8000FFFFFFFFFFC001FFC07FFF3FC003FF -001FF83FC007FE000FFC3FC00FFC0007FE1F801FFC0007FF0F001FF80003FF00001FF800 -03FF00003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003 -FF80003FF80003FF80003FF80003FF80003FF80003FF80001FF80003FF00001FF80003FF -00001FFC0007FF00000FFC0007FE000007FE000FFC000003FF001FF8000001FFC07FF000 -0003FFFFFFE0000003FFFFFF800000078FFFFE0000000780FFE00000000F800000000000 -0F8000000000000F8000000000000F8000000000000FC000000000000FE000000000000F -F000000000000FFFFFFFC000000FFFFFFFFC000007FFFFFFFF800007FFFFFFFFE00003FF -FFFFFFF00001FFFFFFFFFC0000FFFFFFFFFC0003FFFFFFFFFE000FFFFFFFFFFF001FF000 -007FFF003FC0000007FF007F80000001FF807F80000000FF80FF00000000FF80FF000000 -007F80FF000000007F80FF000000007F80FF000000007F80FF80000000FF807F80000000 -FF007FC0000001FF003FE0000003FE001FF0000007FC000FFE00003FF80007FFC001FFF0 -0001FFFFFFFFC000007FFFFFFF0000000FFFFFF8000000007FFF00000032427DAC38>I< -007FC000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC000000000FF -FFC00000000003FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF -C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0 -0000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000 -00000001FFC00000000001FFC00000000001FFC00000000001FFC007FE000001FFC03FFF -800001FFC0FFFFE00001FFC1FFFFF80001FFC7F03FFC0001FFCF801FFC0001FFDF000FFE -0001FFDE000FFE0001FFFC000FFE0001FFF80007FF0001FFF00007FF0001FFF00007FF00 -01FFE00007FF0001FFE00007FF0001FFE00007FF0001FFC00007FF0001FFC00007FF0001 -FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF -C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 -0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 -07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 -FF0001FFC00007FF0001FFC00007FF00FFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFF -FEFFFFFF83FFFFFEFFFFFF83FFFFFE37457CC43E>I<007C0001FF0003FF8007FFC007FF -C00FFFE00FFFE00FFFE00FFFE00FFFE007FFC007FFC003FF8001FF00007C000000000000 -00000000000000000000000000000000000000000000000000007FC07FFFC07FFFC07FFF -C07FFFC07FFFC003FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF -C001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF -C001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF -C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18467CC520>I<000003E000000FF800001FFC00 -003FFE00003FFE00007FFF00007FFF00007FFF00007FFF00007FFF00003FFE00003FFE00 -001FFC00000FF8000003E000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000001FF0003FFFF0003FFFF0003FFFF0003FFFF00 -03FFFF00000FFF000007FF000007FF000007FF000007FF000007FF000007FF000007FF00 -0007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF00 -0007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF00 -0007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF00 -0007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF1F -8007FF3FC007FF7FE007FFFFF007FFFFF00FFEFFF00FFEFFF00FFCFFF01FFCFFE01FF87F -E03FF03FC0FFE01FFFFF800FFFFF0003FFFC0000FFC000205A86C522>I<007FC0000000 -00FFFFC000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC000000000 -03FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 -FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF -C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0 -0000000001FFC00000000001FFC00000000001FFC00000000001FFC0007FFFE001FFC000 -7FFFE001FFC0007FFFE001FFC0007FFFE001FFC0007FFFE001FFC0000FE00001FFC0001F -C00001FFC0003F000001FFC0007E000001FFC000FC000001FFC003F8000001FFC007E000 -0001FFC00FC0000001FFC01F80000001FFC07F00000001FFC0FE00000001FFC1FC000000 -01FFC3FE00000001FFC7FE00000001FFDFFF00000001FFFFFF80000001FFFFFFC0000001 -FFFFFFC0000001FFF9FFE0000001FFE1FFF0000001FFC0FFF8000001FF807FF8000001FF -803FFC000001FF803FFE000001FF801FFF000001FF800FFF000001FF8007FF800001FF80 -07FFC00001FF8003FFE00001FF8001FFE00001FF8000FFF00001FF8000FFF80001FF8000 -7FFC0001FF80003FFC00FFFFFF03FFFFF8FFFFFF03FFFFF8FFFFFF03FFFFF8FFFFFF03FF -FFF8FFFFFF03FFFFF835457DC43B>I<007FC000FFFFC000FFFFC000FFFFC000FFFFC000 -FFFFC00003FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 -01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 -01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 -01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 -01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 -01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 -01FFC00001FFC00001FFC00001FFC00001FFC000FFFFFF80FFFFFF80FFFFFF80FFFFFF80 -FFFFFF8019457CC420>I<007F8007FE00000FFC0000FFFF803FFFC0007FFF8000FFFF80 -FFFFF001FFFFE000FFFF81FFFFF803FFFFF000FFFF87F01FFC0FE03FF800FFFF8FC00FFE -1F801FFC0003FF9F000FFF3E001FFE0001FF9E0007FF3C000FFE0001FFBC0007FF78000F -FE0001FFF80003FFF00007FF0001FFF80003FFF00007FF0001FFF00003FFE00007FF0001 -FFE00003FFC00007FF0001FFE00003FFC00007FF0001FFE00003FFC00007FF0001FFC000 -03FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF80 -0007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF -0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FF -C00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003 -FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF8000 -07FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF00 -01FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC0 -0003FF800007FF0001FFC00003FF800007FF00FFFFFF81FFFFFF03FFFFFEFFFFFF81FFFF -FF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FF -FFFE572D7CAC5E>I<007F8007FE0000FFFF803FFF8000FFFF80FFFFE000FFFF81FFFFF8 -00FFFF87F03FFC00FFFF8F801FFC0003FF9F000FFE0001FF9E000FFE0001FFBC000FFE00 -01FFF80007FF0001FFF00007FF0001FFF00007FF0001FFE00007FF0001FFE00007FF0001 -FFE00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF -C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 -0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 -07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 -FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF -00FFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFE -372D7CAC3E>I<00001FFC0000000001FFFFC000000007FFFFF00000001FFFFFFC000000 -7FF80FFF000000FFC001FF800001FF8000FFC00003FE00003FE00007FE00003FF0000FFC -00001FF8000FF800000FF8001FF800000FFC001FF800000FFC003FF800000FFE003FF000 -0007FE007FF0000007FF007FF0000007FF007FF0000007FF007FF0000007FF00FFF00000 -07FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007 -FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF807FF0000007FF -007FF0000007FF007FF0000007FF007FF0000007FF003FF800000FFE003FF800000FFE00 -1FF800000FFC001FFC00001FFC000FFC00001FF80007FE00003FF00007FE00003FF00003 -FF8000FFE00001FFC001FFC000007FF80FFF0000003FFFFFFE0000000FFFFFF800000001 -FFFFC0000000001FFC000000312F7DAD38>I<007FC00FF80000FFFFC0FFFF8000FFFFC3 -FFFFE000FFFFCFFFFFF800FFFFDFC03FFC00FFFFFF001FFE0003FFFC0007FF0001FFF800 -03FF8001FFF00003FFC001FFE00001FFE001FFC00001FFE001FFC00000FFF001FFC00000 -FFF001FFC000007FF801FFC000007FF801FFC000007FF801FFC000007FF801FFC000003F -FC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC -01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01 -FFC000003FFC01FFC000007FF801FFC000007FF801FFC000007FF801FFC000007FF001FF -C00000FFF001FFC00000FFF001FFC00001FFE001FFE00001FFC001FFF00003FFC001FFF8 -0007FF8001FFFC000FFF0001FFFE001FFE0001FFDFC07FFC0001FFCFFFFFF00001FFC3FF -FFC00001FFC0FFFF000001FFC01FF0000001FFC00000000001FFC00000000001FFC00000 -000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0000000 -0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000000 -FFFFFF80000000FFFFFF80000000FFFFFF80000000FFFFFF80000000FFFFFF8000000036 -407DAC3E>I<007F807F00FFFF81FFE0FFFF83FFF0FFFF8FFFF8FFFF8F8FFCFFFF9F1FFE -03FFBE1FFE01FFBC1FFE01FFF81FFE01FFF81FFE01FFF01FFE01FFF00FFC01FFE007F801 -FFE001E001FFE0000001FFE0000001FFE0000001FFC0000001FFC0000001FFC0000001FF -C0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0 -000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC000 -0001FFC0000001FFC0000001FFC0000001FFC0000001FFC00000FFFFFFE000FFFFFFE000 -FFFFFFE000FFFFFFE000FFFFFFE000272D7DAC2E>114 D<001FFC038000FFFF878003FF -FFFF800FFFFFFF801FF003FF803FC000FF803F80003F807F00001F807E00001F80FE0000 -0F80FE00000F80FE00000780FF00000780FF00000780FF80000780FFE0000000FFFE0000 -007FFFF000007FFFFF00003FFFFFC0003FFFFFF0001FFFFFFC000FFFFFFE0003FFFFFF00 -01FFFFFF80007FFFFF80000FFFFFC000003FFFC0000003FFE0000000FFE0F000003FE0F0 -00003FE0F800001FE0F800000FE0F800000FE0FC00000FE0FC00000FE0FE00000FC0FF00 -001FC0FF00001FC0FF80003F80FFE0007F00FFF803FE00FFFFFFFC00FCFFFFF800F03FFF -E000E007FE0000232F7CAD2C>I<0001E000000001E000000001E000000001E000000001 -E000000003E000000003E000000003E000000003E000000007E000000007E00000000FE0 -0000000FE00000001FE00000001FE00000003FE00000007FE0000000FFE0000003FFE000 -000FFFFFFF80FFFFFFFF80FFFFFFFF80FFFFFFFF80FFFFFFFF8000FFE0000000FFE00000 -00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 -FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF -E0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE001E000FFE001E000FFE0 -01E000FFE001E000FFE001E000FFE001E000FFE001E000FFE001E000FFE001E000FFE003 -E000FFF003C0007FF003C0007FF007C0003FF80F80001FFC1F00000FFFFF000007FFFC00 -0001FFF80000003FE00023407EBE2C>I<007FC00001FF00FFFFC003FFFF00FFFFC003FF -FF00FFFFC003FFFF00FFFFC003FFFF00FFFFC003FFFF0003FFC0000FFF0001FFC00007FF -0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00 -01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001 -FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF -C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 -0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 -0FFF0001FFC0000FFF0001FFC0001FFF0001FFC0001FFF0001FFC0003FFF0000FFC0003F -FF0000FFE0007FFF80007FE001F7FFFE007FF807E7FFFE003FFFFFC7FFFE000FFFFF07FF -FE0003FFFE07FFFE00007FF007FC00372E7CAC3E>IIII E /Fg 6 118 df<0003F000000FF800003E -1C60007C0FF000F807F001F007F003E007F007E003E00FC003E00FC003E01F8007E01F80 -07C03F0007C03F0007C03F000FC07F000F807E000F807E000F807E001F80FE001F00FC00 -1F00FC001F06FC003F07FC003E0FFC003E0EFC007E0E7C007E1E7C00FE1C7C01FC1C3C03 -FC3C3E07BE381F0E1E7807FC0FF001F003C0202278A027>97 D<0000FC000007FF00001F -0780003E03C000FC01C001F803C003F007C007E00FC007C00FC00FC00FC01F8007001F80 -00003F0000003F0000003F0000007F0000007E0000007E0000007E000000FE000000FC00 -0000FC000000FC000000FC0000007C0000C07C0001E07C0001E07C0003C03E000F803E00 -1F001F007C000F81F00003FFC00000FE00001B2278A023>99 D<000FC0000003FFC00000 -03FFC0000003FF800000001F800000001F800000001F800000001F000000001F00000000 -3F000000003F000000003E000000003E000000007E000000007E000000007C000000007C -00000000FC00000000FC00000000F83F800000F8FFE00001FBE0F00001FF80F80001FF00 -780001FE007C0003FC007C0003F8007C0003F0007C0003F0007C0007E000FC0007E000F8 -0007C000F80007C000F8000FC001F8000FC001F0000F8001F0000F8001F0001F8003F000 -1F8003E0001F0007E0001F0007C0C03F0007C1E03F000FC1C03E000F81C03E000F81C07E -000F83C07E000F03807C000F07807C000F0700FC000F0E00FC000F1E00F80007F8007000 -01F00023357BB327>104 D<0003F0001FFC003C1E00780F00F00701E00701E00F03E01F -03C01F03C01F03E00403E00003F00003FF8003FFE001FFF000FFF8007FFC0007FC0000FE -00007E00003E38003EFC003CFC003CFC003CFC007CF00078E000F0F001F07803E03C0F80 -1FFE0003F80018227AA01F>115 D<000300000F80000F80000F80001F80001F80001F00 -001F00003F00003F00003E00003E00007E00007E00007C007FFFF87FFFF8FFFFF800F800 -00F80001F80001F80001F00001F00003F00003F00003E00003E00007E00007E00007C000 -07C0000FC0000FC0000F80000F80601F80F01F80E01F00E01F01E01F01C01F03C01E0380 -1E07001E0F000F1E0007F80001E00015307AAE19>I<01F000000003FC0007000F1E000F -000E1E001F001C1E001F003C1E001F00381E003F00783E003E00703E003E00703E003E00 -707E007E00F07C007C0060FC007C0000F8007C0000F800FC0001F800F80001F000F80001 -F000F80001F001F80003F001F00003E001F00003E001F06003E003F07003E003E0F007C0 -03E0E007C003E0E003C007E1E003C007E1C003E00FC1C003E01FC3C001E03FE38001F071 -E780007FE0FF00001F803C0024227AA029>I E /Fh 2 104 df<000007E000003FE00000 -FE000003F8000007F000000FE000000FC000001FC000001F8000001F8000001F8000001F -8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F -8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F -8000001F8000003F8000003F0000007E000000FC000003F800007FE00000FF0000007FE0 -000003F8000000FC0000007E0000003F0000003F8000001F8000001F8000001F8000001F -8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F -8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F -8000001F8000001FC000000FC000000FE0000007F0000003F8000000FE0000003FE00000 -07E01B4B7BB726>102 DI -E /Fi 38 122 df<00003FE00FE00001FFF83FF80007E01EF83C001F800FF07E003F001F -E0FE007E003FE0FE00FC003FC0FE01F8003FC0FE01F8003FC03803F0001F800003F0001F -800003F0001F800003F0001F800003F0001F800003F0001F800003F0001F800003F0001F -800003F0001F800003F0001F800003F0001F800003F0001F8000FFFFFFFFFFC0FFFFFFFF -FFC0FFFFFFFFFFC003F0001F800003F0001F800003F0001F800003F0001F800003F0001F -800003F0001F800003F0001F800003F0001F800003F0001F800003F0001F800003F0001F -800003F0001F800003F0001F800003F0001F800003F0001F800003F0001F800003F0001F -800003F0001F800003F0001F800003F0001F800003F0001F800003F0001F800003F0001F -800003F0001F800003F0001F800007F8003FC000FFFF83FFFF00FFFF83FFFF00FFFF83FF -FF002F357FB42D>11 D<00001FE0000000FFFC000003F01E00000FC00780001F80078000 -3F000FC0007E001FC000FC001FC000FC001FC001F8001FC001F8000F8001F800000001F8 -00000001F800000001F800000001F800000001F800000001F800000001F800000001F800 -000001F8000FC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC001F8001FC001F8000FC001F8000F -C001F8000FC001F8000FC001F8000FC001F8000FC001F8000FC001F8000FC001F8000FC0 -01F8000FC001F8000FC001F8000FC001F8000FC001F8000FC001F8000FC001F8000FC001 -F8000FC001F8000FC001F8000FC001F8000FC001F8000FC001F8000FC001F8000FC001F8 -000FC003FC001FE07FFFC1FFFF7FFFC1FFFF7FFFC1FFFF28357FB42B>I<3C007E00FF00 -FF00FF80FF807F803D800180018001800180038003000300070006000E000C001C003800 -7000600009177AB315>39 D<3C007E00FF00FF00FF80FF807F803D800180018001800180 -038003000300070006000E000C001C0038007000600009177A8715>44 -D<3C7EFFFFFFFF7E3C08087A8715>46 D<000FE000007FFC0000F83E0003E00F8007C007 -C0078003C00F8003E01F0001F01F0001F03F0001F83F0001F83E0000F87E0000FC7E0000 -FC7E0000FC7E0000FC7E0000FCFE0000FEFE0000FEFE0000FEFE0000FEFE0000FEFE0000 -FEFE0000FEFE0000FEFE0000FEFE0000FEFE0000FEFE0000FEFE0000FEFE0000FEFE0000 -FEFE0000FEFE0000FEFE0000FE7E0000FC7E0000FC7E0000FC7E0000FC7E0000FC3F0001 -F83F0001F83F0001F81F0001F01F0001F00F8003E007C007C007C007C003E00F8000F83E -00007FFC00000FE0001F347DB126>48 D<001FE00000FFFC0001FFFF0007E03F800F001F -C01E000FE01C0007F03F0007F03F8007F83F8003F83FC003F83F8003F83F8003F81F0007 -F8000007F8000007F0000007F000000FE000000FC000001FC000003F8000007E000001F8 -00007FE000007FFC0000003F0000001FC000000FE0000007F0000007F8000003F8000003 -FC000001FC000001FE000001FE000001FE7E0001FEFF0001FEFF0001FEFF0001FEFF0001 -FEFF0001FCFE0003FC780003FC700007F8380007F03C000FF01F001FE00FE03F8003FFFF -0000FFFC00001FE0001F347DB126>51 D<3C7EFFFFFFFF7E3C0000000000000000000000 -00000000003C7EFEFFFFFF7F3F03030303070606060E0C1C38307060082F7A9F15>59 -D<000000E0000000000000E0000000000000E0000000000001F0000000000001F0000000 -000003F8000000000003F8000000000003F8000000000007FC000000000007FC00000000 -0007FC00000000000DFE00000000000CFE00000000000CFE0000000000187F0000000000 -187F0000000000187F0000000000303F8000000000303F8000000000703FC00000000060 -1FC000000000601FC000000000E01FE000000000C00FE000000000C00FE000000001800F -F0000000018007F0000000018007F0000000030003F8000000030003F8000000030003F8 -000000060001FC000000060001FC0000000E0001FE0000000FFFFFFE0000000FFFFFFE00 -00001FFFFFFF0000001800007F0000001800007F0000003000007F8000003000003F8000 -003000003F8000006000001FC000006000001FC000006000001FC00000C000000FE00000 -C000000FE00001C000000FF00001C0000007F00003E0000007F0001FF000000FF800FFFE -0001FFFFE0FFFE0001FFFFE0FFFE0001FFFFE033367DB53A>65 D76 D78 D<001FE00300007FFC070001FFFF07 -0007F01FCF000F8003FF001F0000FF003E00007F003E00003F007C00001F007C00001F00 -7800000F00F800000700F800000700F800000700F800000700FC00000300FC00000300FE -00000300FE000000007F000000007FC00000003FF00000003FFF0000001FFFF000000FFF -FF000007FFFFC00003FFFFF00000FFFFF800003FFFFC000003FFFE0000003FFF00000003 -FF00000000FF800000007F800000003F800000001FC00000000FC0C000000FC0C000000F -C0C0000007C0C0000007C0C0000007C0E0000007C0E0000007C0F000000F80F000000F80 -F800000F00FC00001F00FE00003E00FF00007E00FFC000FC00F1FC03F800E0FFFFE000E0 -1FFF8000C003FE000022377CB42B>83 D<7FFFFFFFFFFE7FFFFFFFFFFE7FFFFFFFFFFE7F -8007F001FE7C0007F0003E780007F0001E700007F0000E700007F0000E600007F00006E0 -0007F00007E00007F00007E00007F00007C00007F00003C00007F00003C00007F00003C0 -0007F00003C00007F00003C00007F00003000007F00000000007F00000000007F0000000 -0007F00000000007F00000000007F00000000007F00000000007F00000000007F0000000 -0007F00000000007F00000000007F00000000007F00000000007F00000000007F0000000 -0007F00000000007F00000000007F00000000007F00000000007F00000000007F0000000 -0007F00000000007F00000000007F00000000007F00000000007F00000000007F0000000 -0007F00000000007F0000000000FF80000001FFFFFFC00001FFFFFFC00001FFFFFFC0030 -337DB237>II -91 D93 D<007F80000003FFF000000F80FC00001C003E00 -003F003F00003F801F80003F800FC0003F800FC0003F8007E0001F0007E000000007E000 -000007E000000007E000000007E0000001FFE000001FFFE00000FF87E00003FC07E0000F -F007E0001FC007E0003F8007E0007F8007E0007F0007E000FF0007E0C0FE0007E0C0FE00 -07E0C0FE0007E0C0FE000FE0C0FE000FE0C0FF001FE0C07F003BE0C03F8071F1801FC1E1 -FF8007FFC0FF0000FE003C0022237DA126>97 D<03F0000000FFF0000000FFF0000000FF -F000000007F000000003F000000003F000000003F000000003F000000003F000000003F0 -00000003F000000003F000000003F000000003F000000003F000000003F000000003F000 -000003F000000003F03F800003F0FFE00003F3C0F80003F7007E0003FE003F0003FC001F -8003F8000FC003F0000FC003F00007E003F00007F003F00007F003F00003F003F00003F8 -03F00003F803F00003F803F00003F803F00003F803F00003F803F00003F803F00003F803 -F00003F803F00003F803F00003F003F00007F003F00007E003F00007E003F0000FC003F8 -000FC003FC001F8003EC003F0003CF007C00038381F8000301FFE00000007F000025357E -B32B>I<0007F800003FFF0000FC07C001F000E003E003F007C007F00FC007F01F8007F0 -3F8007F03F0003E07F0000007F0000007E000000FE000000FE000000FE000000FE000000 -FE000000FE000000FE000000FE000000FE000000FE0000007F0000007F0000003F000018 -3F8000181F8000381FC000300FC0007007E000E003F001C000FC0F80003FFE000007F000 -1D237EA122>I<0000003F0000000FFF0000000FFF0000000FFF000000007F000000003F -000000003F000000003F000000003F000000003F000000003F000000003F000000003F00 -0000003F000000003F000000003F000000003F000000003F000000003F000007F03F0000 -3FFC3F0000FC0F3F0001F003BF0007E001FF000FC000FF001F80007F001F80003F003F00 -003F003F00003F007F00003F007E00003F00FE00003F00FE00003F00FE00003F00FE0000 -3F00FE00003F00FE00003F00FE00003F00FE00003F00FE00003F00FE00003F007E00003F -007F00003F007F00003F003F00003F001F80007F001F80007F000FC000FF0007E001FF80 -03F007BFFC00F81E3FFC003FFC3FFC000FE03F0026357DB32B>I<000FE000007FFC0000 -F83F0003F00F8007E00FC00FC007E01F8003E01F8003F03F0003F03F0001F07F0001F87E -0001F87E0001F8FE0001F8FE0001F8FFFFFFF8FFFFFFF8FE000000FE000000FE000000FE -000000FE0000007E0000007F0000007F0000003F0000183F0000181F8000380F8000300F -C0007007E000E001F003C000FC0F00003FFE000007F0001D237EA122>I<0001FC000007 -FF00001F0780003E0FC0007C1FC000FC1FC001F81FC001F81FC003F8070003F0000003F0 -000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0 -000003F00000FFFFF000FFFFF000FFFFF00003F0000003F0000003F0000003F0000003F0 -000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0 -000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0 -000003F0000003F0000007F800007FFFE0007FFFE0007FFFE0001A357FB417>I<000000 -1F00001FC07F8000FFF8E3C001F07FC7C007E03F03C00FC01F83800F800F80001F800FC0 -001F0007C0003F0007E0003F0007E0003F0007E0003F0007E0003F0007E0003F0007E000 -1F0007C0001F800FC0000F800F80000FC01F800007E03F000007F07C00000EFFF800000C -1FC000001C000000001C000000001C000000001E000000001E000000001F000000000FFF -FE00000FFFFFC00007FFFFF00003FFFFFC0007FFFFFE001F0001FE003E00007F007C0000 -3F007C00001F80F800000F80F800000F80F800000F80F800000F80F800000F80FC00001F -807C00001F003E00003E001F00007C000FC001F80003F007E00000FFFF8000001FFC0000 -22337EA126>I<03F0000000FFF0000000FFF0000000FFF000000007F000000003F00000 -0003F000000003F000000003F000000003F000000003F000000003F000000003F0000000 -03F000000003F000000003F000000003F000000003F000000003F000000003F01FC00003 -F07FF00003F1E0FC0003F3807C0003F7007E0003FE007E0003FC003F0003FC003F0003F8 -003F0003F8003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F000 -3F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F -0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0007F8007F80 -FFFFC7FFFCFFFFC7FFFCFFFFC7FFFC26347EB32B>I<07800FC01FE01FE01FE01FE00FC0 -0780000000000000000000000000000000000000000007E0FFE0FFE0FFE00FE007E007E0 -07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E0 -07E007E007E007E00FF0FFFFFFFFFFFF10337EB215>I<07E0FFE0FFE0FFE00FE007E007 -E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007 -E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007 -E007E007E007E007E007E00FF0FFFFFFFFFFFF10347EB315>108 -D<03F01FE000FF0000FFF07FF803FFC000FFF1E07C0F03E000FFF3803E1C01F00007F700 -3F3801F80003FE003F7001F80003FC001FE000FC0003FC001FE000FC0003F8001FC000FC -0003F8001FC000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F000 -1F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC -0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F000 -1F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC -0003F0001F8000FC0003F0001F8000FC0007F8003FC001FE00FFFFC7FFFE3FFFF0FFFFC7 -FFFE3FFFF0FFFFC7FFFE3FFFF03C217EA041>I<03F01FC000FFF07FF000FFF1E0FC00FF -F3807C0007F7007E0003FE007E0003FC003F0003FC003F0003F8003F0003F8003F0003F0 -003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F000 -3F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F -0003F0003F0003F0003F0003F0003F0003F0003F0007F8007F80FFFFC7FFFCFFFFC7FFFC -FFFFC7FFFC26217EA02B>I<0007F00000003FFE000000FC1F800001F007C00003C001E0 -0007C001F0000F8000F8001F00007C001F00007C003F00007E003E00003E007E00003F00 -7E00003F007E00003F00FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE -00003F80FE00003F80FE00003F807E00003F007E00003F007E00003F003F00007E003F00 -007E001F00007C001F8000FC000FC001F80007C001F00003F007E00000FC1F8000003FFE -00000007F0000021237EA126>I<03F03F8000FFF0FFE000FFF3C0F800FFF7007E0007FE -003F0003FC001F8003F8001FC003F0000FC003F0000FE003F00007F003F00007F003F000 -07F003F00003F803F00003F803F00003F803F00003F803F00003F803F00003F803F00003 -F803F00003F803F00003F803F00007F803F00007F003F00007F003F00007E003F0000FE0 -03F0000FC003F8001FC003FC003F8003FC003F0003FF00FC0003F381F80003F1FFE00003 -F07F000003F000000003F000000003F000000003F000000003F000000003F000000003F0 -00000003F000000003F000000003F000000007F8000000FFFFC00000FFFFC00000FFFFC0 -000025307EA02B>I<03E07C00FFE1FF00FFE38F80FFE71FC007EE1FC003EC1FC003EC1F -C003FC0F8003F8000003F8000003F8000003F0000003F0000003F0000003F0000003F000 -0003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000 -0003F0000003F0000003F0000003F0000007F80000FFFFE000FFFFE000FFFFE0001A217F -A01E>114 D<00FF060007FFCE001F00FE003C003E0078001E0078000E00F0000E00F000 -0600F0000600F8000600F8000600FE000000FF8000007FFC00003FFFC0003FFFF0000FFF -F80007FFFC0000FFFE00000FFF000000FF0000003F80C0001F80C0000F80E0000780E000 -0780E0000780F0000780F0000700F8000F00FC000E00FE001C00F7807800E1FFE000C07F -800019237EA11E>I<00300000300000300000300000300000700000700000700000F000 -00F00001F00001F00003F00007F0001FFFFEFFFFFEFFFFFE03F00003F00003F00003F000 -03F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F003 -03F00303F00303F00303F00303F00303F00303F00303F00701F80601F80600FC0E007E1C -001FF80007E0182F7FAD1E>I<03F0003F00FFF00FFF00FFF00FFF00FFF00FFF0007F000 -7F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F -0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F00 -03F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0007F0003F0007F0003 -F0007F0003F000FF0001F000FF0001F801FF8000F803BFFC007E073FFC001FFE3FFC0007 -F83F0026227EA02B>IIII<7FFF807FF87FFF807FF87FFF807FF807F8001FC003F8000F80 -01F800070001F800060000FC000C0000FC000C0000FE001C00007E001800007E00180000 -3F003000003F003000003F807000001F806000001FC0E000000FC0C000000FC0C0000007 -E180000007E180000007F380000003F300000003FB00000001FE00000001FE00000000FC -00000000FC00000000FC0000000078000000007800000000300000000030000000006000 -0000006000000000E000000000C000000000C0000000018000007801800000FC03000000 -FC03000000FC06000000FC0E000000701C00000078380000001FF00000000FC000000025 -307F9F29>I E /Fj 5 53 df<0000380000000038000000003800000000380000000038 -000000003800000000380000000038000000003800000000380000000038000000003800 -00000038000000003800000000380000000038000000003800000000380000FFFFFFFFFE -FFFFFFFFFEFFFFFFFFFE0000380000000038000000003800000000380000000038000000 -003800000000380000000038000000003800000000380000000038000000003800000000 -3800000000380000000038000000003800000000380000000038000027277C9F2F>43 -D<00E00001E00007E000FFE000F9E00001E00001E00001E00001E00001E00001E00001E0 -0001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E0 -0001E00001E00001E00001E00001E00001E00003F000FFFFC0FFFFC012217AA01E>49 -D<01FC0007FF801C0FC03003E06001F06000F8F800F8FC00FCFC00FCFC007C78007C3000 -FC0000FC0000F80000F80001F00003E00003C0000780000F00001E0000380000700000E0 -0001C00C03800C0600180C00181800183FFFF87FFFF8FFFFF0FFFFF016217CA01E>I<00 -FF0003FFC00F03E01C00F01C00F83E00FC3E007C3E007C1E00FC0C00FC0000F80000F800 -01F00003E0000FC001FF0001FF000003E00000F000007800007C00003E00003F30003F78 -003FFC003FFC003FFC003EF8007E60007C3800F81E03F00FFFC001FF0018227DA01E>I< -0000E00001E00001E00003E00007E00007E0000DE0001DE00039E00031E00061E000E1E0 -00C1E00181E00381E00701E00601E00C01E01C01E01801E03001E07001E0E001E0FFFFFF -FFFFFF0001E00001E00001E00001E00001E00001E00003F0003FFF003FFF18227DA11E> -I E /Fk 5 107 df<000FFC0000003FFF000000FFFFC00003FFFFF00007FFFFF8000FFF -FFFC001FFFFFFE003FFFFFFF003FFFFFFF007FFFFFFF807FFFFFFF807FFFFFFF80FFFFFF -FFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFF -C0FFFFFFFFC0FFFFFFFFC07FFFFFFF807FFFFFFF807FFFFFFF803FFFFFFF003FFFFFFF00 -1FFFFFFE000FFFFFFC0007FFFFF80003FFFFF00000FFFFC000003FFF0000000FFC000022 -227BA72D>15 D<0000000000000030000000000000000000780000000000000000007800 -00000000000000007C0000000000000000003C0000000000000000003C00000000000000 -00003E0000000000000000001E0000000000000000001E0000000000000000001F000000 -0000000000000F8000000000000000000F80000000000000000007C00000000000000000 -03E0000000000000000003E0000000000000000001F0000000000000000000F800000000 -00000000007C0000000000000000007E0000000000000000001F8000000000000000000F -C0000000000000000007F07FFFFFFFFFFFFFFFFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFF7FFFFFFFFFFFFFFFFFFC000000000000000007F000000000000000000FC000 -000000000000001F8000000000000000007E0000000000000000007C0000000000000000 -00F8000000000000000001F0000000000000000003E0000000000000000003E000000000 -0000000007C000000000000000000F8000000000000000000F8000000000000000001F00 -00000000000000001E0000000000000000001E0000000000000000003E00000000000000 -00003C0000000000000000003C0000000000000000007C00000000000000000078000000 -0000000000007800000000000000000030000050307BAE5B>33 D<0000003F000003FF00 -000FE000003F8000007E000001FC000001F8000003F0000003F0000007E0000007E00000 -07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000 -07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000 -07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E000000FE00000 -0FC000001FC000003F8000003F000000FE000003F800007FE00000FF0000007FE0000003 -F8000000FE0000003F0000003F8000001FC000000FC000000FE0000007E0000007E00000 -07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000 -07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000 -07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000003F00000 -03F0000001F8000001FC0000007E0000003F8000000FE0000003FF0000003F205B7AC32D ->102 DI<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 -F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 -F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F060045B -76C319>106 D E /Fl 4 53 df<000C00003C00007C0003FC00FFFC00FC7C00007C0000 -7C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000 -7C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000 -7C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000FE007FFFFE7F -FFFE172C7AAB23>49 D<007F800001FFF0000780FC000E003F001C001F8038000FC07000 -0FC0600007E0F00007E0FC0007F0FE0007F0FE0003F0FE0003F0FE0003F07C0007F00000 -07F0000007F0000007E000000FE000000FC000001FC000001F8000003F0000007E000000 -7C000000F8000001F0000003E0000007C000000F8000001E0000003C00000078000000F0 -003000E0003001C0003003800060070000600E0000E01FFFFFE03FFFFFE07FFFFFC0FFFF -FFC0FFFFFFC01C2C7DAB23>I<003FC00001FFF00007C0FC000E007E001C003F001C001F -803F001FC03F001FC03F800FC03F000FC03F000FC00C001FC000001FC000001F8000001F -8000003F0000003E0000007C000000F8000003F00000FFC00000FFF0000000FC0000003F -0000001F8000001FC000000FC000000FE000000FE0000007F0000007F0380007F07C0007 -F0FE0007F0FE0007F0FE0007F0FE000FE0F8000FE060000FC070001FC038001F801E003F -000780FC0001FFF000007FC0001C2D7DAB23>I<00000E0000000E0000001E0000003E00 -00003E0000007E000000FE000000FE000001BE000003BE0000033E0000063E00000E3E00 -000C3E0000183E0000383E0000303E0000603E0000E03E0000C03E0001803E0003803E00 -03003E0006003E000E003E000C003E0018003E0038003E0030003E0060003E00E0003E00 -FFFFFFFCFFFFFFFC00003E0000003E0000003E0000003E0000003E0000003E0000003E00 -00003E0000003E0000007F00001FFFFC001FFFFC1E2D7EAC23>I -E /Fm 52 122 df<000000FFF8000000000FFFFF000000007FFFFF80000001FFFFFFE000 -0007FFC01FF000000FFE0007F000001FF8000FF800003FE0001FF800007FC0003FFC0000 -FFC0003FFC0000FF80003FFC0001FF80003FFC0001FF00003FFC0001FF00003FFC0001FF -00001FF80001FF00000FF00001FF000003C00001FF000000000001FF000000000001FF00 -0000000001FF000000000001FF000000000001FF000000000001FF000003FC00FFFFFFFF -FFFC00FFFFFFFFFFFC00FFFFFFFFFFFC00FFFFFFFFFFFC00FFFFFFFFFFFC0001FF80001F -FC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC -0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC00 -01FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001 -FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF -80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC0001FF80 -000FFC0001FF80000FFC0001FF80000FFC0001FF80000FFC007FFFFE03FFFFF07FFFFE03 -FFFFF07FFFFE03FFFFF07FFFFE03FFFFF07FFFFE03FFFFF034407EBF3A>12 -D<0FC0001F801FE0003FC03FF0007FE07FF800FFF0FFFC01FFF8FFFC01FFF8FFFC01FFF8 -FFFE01FFFCFFFE01FFFCFFFE01FFFC7FFE00FFFC3FFE007FFC1FFE003FFC0FDE001FBC00 -1E00003C001E00003C003E00007C003C000078003C000078007C0000F800780000F00078 -0000F000F80001F001F00003E001F00003E003E00007C007C0000F800F80001F001F8000 -3F003F00007E003E00007C001C0000380026207DBE37>34 D45 -D<0FC01FE03FF07FF8FFFCFFFCFFFCFFFCFFFCFFFC7FF83FF01FE00FC00E0E798D1D>I< -0000FFE000000007FFFC0000001FFFFF0000007FFFFFC00000FFE0FFE00001FF803FF000 -03FE000FF80007FC0007FC0007FC0007FC000FF80003FE001FF80003FF001FF80003FF00 -1FF80003FF003FF00001FF803FF00001FF803FF00001FF807FF00001FFC07FF00001FFC0 -7FF00001FFC07FF00001FFC07FF00001FFC0FFF00001FFE0FFF00001FFE0FFF00001FFE0 -FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0 -FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0 -FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE0FFF00001FFE07FF00001FFC0 -7FF00001FFC07FF00001FFC07FF00001FFC07FF00001FFC03FF00001FF803FF80003FF80 -3FF80003FF801FF80003FF001FF80003FF000FF80003FE000FFC0007FE0007FE000FFC00 -03FF001FF80001FF803FF00000FFE0FFE000007FFFFFC000001FFFFF00000007FFFC0000 -0000FFE000002B3D7CBB34>48 D<00000F000000003F000000007F00000001FF0000000F -FF000001FFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFF7FF0000FE07FF00000007FF -00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00 -000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF0000 -0007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF000000 -07FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007 -FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF -00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00 -00FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0243C78BB34>I<0003FF -800000003FFFF8000000FFFFFE000003FFFFFF800007FFFFFFC0000FF80FFFE0001FC003 -FFF0003F8000FFF8007FC0007FFC007FE0003FFE00FFF0003FFE00FFF8001FFF00FFF800 -1FFF00FFF8000FFF80FFF8000FFF80FFF8000FFF80FFF8000FFF807FF0000FFF803FE000 -0FFF801FC0000FFF800700000FFF800000000FFF800000001FFF000000001FFF00000000 -1FFE000000003FFE000000003FFC000000007FF8000000007FF800000000FFF000000000 -FFE000000001FFC000000003FF8000000007FE0000000007FC000000000FF8000000001F -E0000000003FC0000000007F8000000000FF000F800001FC000F800003F8000F800007F0 -001F00000FE0001F00001F80001F00003F00001F00007E00003F0000FC00003F0001FFFF -FFFF0003FFFFFFFE0007FFFFFFFE000FFFFFFFFE001FFFFFFFFE003FFFFFFFFE007FFFFF -FFFE00FFFFFFFFFE00FFFFFFFFFC00FFFFFFFFFC00FFFFFFFFFC00FFFFFFFFFC00293C7B -BB34>I<0001FFE00000000FFFFE0000003FFFFF800000FFFFFFE00001FF81FFF00003FC -007FF80007F0003FFC0007F0003FFE000FFC001FFE000FFE001FFF001FFE001FFF001FFF -001FFF001FFF001FFF001FFF001FFF001FFF001FFF001FFF001FFF000FFE001FFF000FFE -001FFE0007FC003FFE0001F0003FFC000000003FFC000000007FF8000000007FF0000000 -00FFE000000001FFC00000000FFF80000007FFFE00000007FFF800000007FFFE00000007 -FFFFC000000001FFF0000000007FF8000000003FFC000000001FFE000000000FFF000000 -000FFF800000000FFF8000000007FFC000000007FFC000000007FFE00FC00007FFE01FE0 -0007FFE03FF00007FFE07FF80007FFE0FFFC0007FFE0FFFC0007FFE0FFFC0007FFE0FFFC -0007FFC0FFFC0007FFC0FFFC000FFFC0FFF8000FFF807FF8000FFF807FF0001FFF003FC0 -003FFE001FE0007FFC000FFE01FFF80007FFFFFFF00003FFFFFFE00000FFFFFF8000003F -FFFE00000003FFE000002B3D7CBB34>I<00000001F80000000003F80000000007F80000 -000007F8000000000FF8000000001FF8000000003FF8000000003FF8000000007FF80000 -0000FFF800000001FFF800000003FFF800000003FFF800000007FFF80000000FFFF80000 -001FBFF80000003F3FF80000003E3FF80000007C3FF8000000FC3FF8000001F83FF80000 -01F03FF8000003E03FF8000007E03FF800000FC03FF800001F803FF800001F003FF80000 -3E003FF800007E003FF80000FC003FF80001F8003FF80001F0003FF80003E0003FF80007 -E0003FF8000FC0003FF8000F80003FF8001F00003FF8003F00003FF8007E00003FF800FC -00003FF800FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF800 -00007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF80000 -00007FF8000000007FF8000000007FF8000000007FF8000001FFFFFFF80001FFFFFFF800 -01FFFFFFF80001FFFFFFF80001FFFFFFF82D3C7DBB34>I<0700000038000FE00001F800 -0FFE003FF8000FFFFFFFF8000FFFFFFFF0000FFFFFFFE0000FFFFFFFC0000FFFFFFF8000 -0FFFFFFF00000FFFFFFE00000FFFFFF800000FFFFFF000000FFFFFC000000FFFFE000000 -0F80000000000F80000000000F80000000000F80000000000F80000000000F8000000000 -0F80000000000F80000000000F80000000000F80FFC000000F87FFFC00000F9FFFFF0000 -0FFFFFFF80000FFF01FFE0000FF8007FF0000FF0003FF8000FC0001FFC000F80001FFC00 -0700001FFE000000000FFE000000000FFF000000000FFF000000000FFF000000000FFF80 -0000000FFF800700000FFF801FC0000FFF803FE0000FFF807FF0000FFF80FFF0000FFF80 -FFF8000FFF80FFF8000FFF80FFF8000FFF00FFF8000FFF00FFF0000FFF00FFF0001FFE00 -7FE0001FFE007F80001FFC003F00003FFC003F80007FF8001FE000FFF0000FFC07FFE000 -07FFFFFFC00003FFFFFF000000FFFFFC0000003FFFF000000007FF000000293D7BBB34> -I<000007FF000000003FFFC0000001FFFFF0000007FFFFF800000FFF03FC00003FF800FC -00007FE001FE0000FFC003FE0001FF8007FF0003FF000FFF0003FF000FFF0007FE000FFF -000FFE000FFF000FFE000FFF001FFC000FFF001FFC0007FE003FFC0003FC003FFC0001F8 -003FFC000000007FF8000000007FF8000000007FF8020000007FF83FFE0000FFF87FFF80 -00FFF9FFFFE000FFFBFFFFF000FFFBE03FF800FFFF800FFC00FFFF0007FE00FFFF0007FF -00FFFE0007FF00FFFE0003FF80FFFC0003FFC0FFFC0003FFC0FFFC0003FFC0FFFC0003FF -E0FFF80003FFE0FFF80003FFE0FFF80003FFE0FFF80003FFE07FF80003FFE07FF80003FF -E07FF80003FFE07FF80003FFE07FF80003FFE03FF80003FFE03FF80003FFE03FFC0003FF -C01FFC0003FFC01FFC0003FFC00FFC0007FF800FFE0007FF0007FE0007FF0003FF000FFE -0001FF801FFC0000FFE07FF800007FFFFFF000003FFFFFE000001FFFFF80000007FFFE00 -000000FFF000002B3D7CBB34>I<1F00000000001F80000000001FF8000000001FFFFFFF -FFF01FFFFFFFFFF01FFFFFFFFFF01FFFFFFFFFF03FFFFFFFFFF03FFFFFFFFFE03FFFFFFF -FFC03FFFFFFFFF803FFFFFFFFF003FFFFFFFFE003FFFFFFFFC007FFFFFFFFC007E000001 -F8007E000003F0007C000007E0007C00000FC0007C00001F80007C00001F0000F800003F -0000F800007E0000F80000FC0000000001F80000000003F00000000003F00000000007E0 -000000000FE0000000000FC0000000001FC0000000003FC0000000003F80000000007F80 -000000007F8000000000FF8000000000FF0000000001FF0000000001FF0000000003FF00 -00000003FF0000000003FF0000000007FE0000000007FE0000000007FE000000000FFE00 -0000000FFE000000000FFE000000000FFE000000000FFE000000001FFE000000001FFE00 -0000001FFE000000001FFE000000001FFE000000001FFE000000001FFE000000001FFE00 -0000001FFE000000001FFE000000000FFC0000000007F80000000003F00000002C3F7ABD -34>I<0000FFF000000007FFFE0000001FFFFF8000007FFFFFE00000FFC07FF00001FE00 -1FF80003FC000FFC0007F80007FE0007F80003FE000FF00003FE000FF00003FF000FF000 -01FF001FF00001FF001FF00001FF001FF80001FF001FFC0001FF001FFE0001FF001FFF00 -03FF001FFFC003FE001FFFF003FE000FFFF807FC000FFFFE0FF8000FFFFF9FF00007FFFF -FFE00003FFFFFFC00003FFFFFF800001FFFFFF000000FFFFFF8000007FFFFFE000001FFF -FFF000003FFFFFF80000FFFFFFFC0001FFFFFFFE0007FE3FFFFF000FFC1FFFFF801FF807 -FFFF801FF001FFFFC03FE0007FFFC07FE0003FFFC07FC0000FFFE07FC00003FFE0FF8000 -01FFE0FF800000FFE0FF8000007FE0FF8000007FE0FF8000003FE0FF8000003FE0FF8000 -003FE0FFC000003FC07FC000003FC07FC000007F807FE000007F803FF00000FF001FF800 -01FF001FFE0007FE000FFFC03FFC0007FFFFFFF80001FFFFFFE000007FFFFFC000001FFF -FE00000001FFF000002B3D7CBB34>I<0001FFE00000000FFFFC0000003FFFFF000000FF -FFFFC00001FFE0FFE00003FF003FF00007FE001FF8000FFE000FFC001FFC000FFC001FFC -0007FE003FFC0007FE007FF80007FF007FF80003FF007FF80003FF80FFF80003FF80FFF8 -0003FF80FFF80003FFC0FFF80003FFC0FFF80003FFC0FFF80003FFC0FFF80003FFC0FFF8 -0003FFE0FFF80003FFE0FFF80003FFE0FFF80003FFE07FF80007FFE07FF80007FFE07FF8 -0007FFE07FF80007FFE03FF8000FFFE01FFC000FFFE01FFC001FFFE00FFE001FFFE007FE -003FFFE003FF80FBFFE001FFFFFBFFE0007FFFF3FFE0003FFFC3FFE0000FFF83FFC00000 -0803FFC000000003FFC000000003FFC000000007FF8003F00007FF8007F80007FF800FFC -0007FF001FFE0007FF001FFE000FFE001FFE000FFE001FFE000FFC001FFE001FFC001FFE -003FF8001FFC003FF0000FF800FFE0000FF001FFC00007FC0FFF800003FFFFFF000001FF -FFFC000000FFFFF00000007FFFC00000000FFE0000002B3D7CBB34>I<0FC01FE03FF07F -F8FFFCFFFCFFFCFFFCFFFCFFFC7FF83FF01FE00FC0000000000000000000000000000000 -0000000000000000000FC01FE03FF07FF8FFFCFFFCFFFCFFFCFFFCFFFC7FF83FF01FE00F -C00E2879A71D>I<00000000FC0000000000000000FC0000000000000001FE0000000000 -000001FE0000000000000003FF0000000000000003FF0000000000000003FF0000000000 -000007FF8000000000000007FF800000000000000FFFC00000000000000FFFC000000000 -00000FFFC00000000000001FFFE00000000000001FFFE00000000000003FFFF000000000 -00003FFFF00000000000003FFFF00000000000007FFFF80000000000007CFFF800000000 -0000FCFFFC000000000000F87FFC000000000000F87FFC000000000001F87FFE00000000 -0001F03FFE000000000003F03FFF000000000003E01FFF000000000007E01FFF80000000 -0007C01FFF800000000007C00FFF80000000000FC00FFFC0000000000F8007FFC0000000 -001F8007FFE0000000001F0007FFE0000000001F0003FFE0000000003F0003FFF0000000 -003E0001FFF0000000007E0001FFF8000000007C0000FFF8000000007C0000FFF8000000 -00FC0000FFFC00000000F800007FFC00000001FFFFFFFFFE00000001FFFFFFFFFE000000 -01FFFFFFFFFE00000003FFFFFFFFFF00000003FFFFFFFFFF00000007E000001FFF800000 -07C000000FFF8000000FC000000FFFC000000F8000000FFFC000000F80000007FFC00000 -1F80000007FFE000001F00000003FFE000003F00000003FFF000003E00000003FFF00000 -3E00000001FFF000007E00000001FFF800007C00000000FFF800FFFFFC0000FFFFFFFCFF -FFFC0000FFFFFFFCFFFFFC0000FFFFFFFCFFFFFC0000FFFFFFFCFFFFFC0000FFFFFFFC46 -3F7CBE4F>65 DI<00000007FFC0000E000000FFFFFC001E000007FFFFFF003E00003FFFFFFF -C07E0000FFFFFFFFE1FE0003FFFF803FFBFE0007FFF80003FFFE000FFFC00000FFFE003F -FF0000007FFE007FFE0000001FFE00FFF80000000FFE01FFF000000007FE03FFE0000000 -07FE03FFC000000003FE07FFC000000001FE0FFF8000000001FE0FFF8000000000FE1FFF -0000000000FE1FFF00000000007E3FFF00000000007E3FFE00000000007E3FFE00000000 -003E7FFE00000000003E7FFE00000000003E7FFE00000000003E7FFC000000000000FFFC -000000000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC00000000 -0000FFFC000000000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC -000000000000FFFC000000000000FFFC0000000000007FFC0000000000007FFE00000000 -00007FFE00000000003E7FFE00000000003E3FFE00000000003E3FFE00000000003E3FFF -00000000003E1FFF00000000007E1FFF00000000007C0FFF80000000007C0FFF80000000 -00FC07FFC000000000F803FFE000000001F803FFE000000001F001FFF000000003F000FF -F800000007E0007FFE0000000FC0003FFF0000003F80000FFFC00000FF000007FFF80003 -FE000003FFFF801FFC000000FFFFFFFFF80000003FFFFFFFE000000007FFFFFF80000000 -00FFFFFC000000000007FFC000003F407ABE4C>II -II73 D76 -D<0000003FFF00000000000003FFFFF000000000001FFFFFFE00000000007FFFFFFF8000 -000001FFF807FFE000000007FFC000FFF80000000FFF00003FFC0000003FFC00000FFF00 -00007FF8000007FF800000FFF0000003FFC00001FFE0000001FFE00001FFC0000000FFE0 -0003FFC0000000FFF00007FF800000007FF80007FF800000007FF8000FFF000000003FFC -001FFF000000003FFE001FFF000000003FFE001FFE000000001FFE003FFE000000001FFF -003FFE000000001FFF003FFE000000001FFF007FFC000000000FFF807FFC000000000FFF -807FFC000000000FFF807FFC000000000FFF80FFFC000000000FFFC0FFFC000000000FFF -C0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFF -C0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFF -C0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFFC07FFC000000000FFF -807FFE000000001FFF807FFE000000001FFF807FFE000000001FFF803FFE000000001FFF -003FFE000000001FFF003FFF000000003FFF001FFF000000003FFE001FFF000000003FFE -000FFF800000007FFC000FFF800000007FFC0007FFC0000000FFF80003FFE0000001FFF0 -0003FFE0000001FFF00001FFF0000003FFE00000FFF8000007FFC000007FFC00000FFF80 -00003FFF00003FFF0000001FFFC000FFFE00000007FFF807FFF800000001FFFFFFFFE000 -000000FFFFFFFFC0000000001FFFFFFE000000000003FFFFF00000000000003FFF000000 -0042407ABE4F>79 DI82 -D<0003FFC001C0001FFFF803C0007FFFFE07C001FFFFFF8FC003FFFFFFDFC007FF00FFFF -C00FF8000FFFC01FF00003FFC01FE00001FFC03FC000007FC07FC000007FC07F8000003F -C07F8000001FC0FF8000001FC0FF8000000FC0FF8000000FC0FFC000000FC0FFC0000007 -C0FFC0000007C0FFE0000007C0FFF0000007C0FFFC00000000FFFF800000007FFFF80000 -007FFFFFC000003FFFFFFC00003FFFFFFF80001FFFFFFFE0001FFFFFFFF8000FFFFFFFFC -0007FFFFFFFE0003FFFFFFFF0001FFFFFFFF80007FFFFFFFC0003FFFFFFFC00007FFFFFF -E000007FFFFFE0000007FFFFF00000003FFFF000000003FFF000000000FFF8000000007F -F8000000003FF8780000003FF8F80000001FF8F80000001FF8F80000000FF8F80000000F -F8FC0000000FF8FC0000000FF8FC0000000FF0FE0000000FF0FE0000001FF0FF0000001F -E0FF8000003FE0FFE000003FC0FFF800007F80FFFE0001FF80FFFFE007FF00FEFFFFFFFE -00FC7FFFFFF800F81FFFFFF000F003FFFFC000E0003FFE00002D407ABE3A>I<3FFFFFFF -FFFFFFFC3FFFFFFFFFFFFFFC3FFFFFFFFFFFFFFC3FFFFFFFFFFFFFFC3FFFFFFFFFFFFFFC -3FFE003FFE003FFC7FF0003FFE000FFE7FC0003FFE0003FE7F80003FFE0001FE7F00003F -FE0000FE7F00003FFE00007E7E00003FFE00007E7E00003FFE00007E7C00003FFE00003E -7C00003FFE00003E7C00003FFE00003E7C00003FFE00003EFC00003FFE00003FF800003F -FE00001FF800003FFE00001FF800003FFE00001FF800003FFE00001FF800003FFE00001F -0000003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003F -FE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003FFE000000 -0000003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003F -FE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003FFE000000 -0000003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003F -FE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003FFE000000 -0000003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003F -FE0000000000003FFE000000000FFFFFFFFFF800000FFFFFFFFFF800000FFFFFFFFFF800 -000FFFFFFFFFF800000FFFFFFFFFF800403D7CBC49>I<00700000E000F80001F001F800 -03F003F00007E003E00007C007C0000F800F80001F001F00003E001F00003E003E00007C -003C000078003C000078007C0000F800780000F000780000F000F80001F000F00001E000 -F00001E000F7E001EFC0FFF001FFE0FFF801FFF0FFFC01FFF8FFFE01FFFCFFFE01FFFCFF -FE01FFFC7FFE00FFFC7FFE00FFFC7FFE00FFFC3FFC007FF81FF8003FF00FF0001FE007E0 -000FC0262073BE37>92 D<0007FFC00000003FFFF8000001FFFFFF000003FFFFFF800007 -FE03FFC0000FF800FFE0000FFC003FF0001FFE003FF8001FFE001FFC001FFE001FFC001F -FE001FFC001FFE000FFE001FFE000FFE000FFC000FFE0007F8000FFE0001E0000FFE0000 -00000FFE000000003FFE000000FFFFFE00000FFFFFFE00007FFFFFFE0001FFFE0FFE0003 -FFE00FFE000FFF800FFE001FFE000FFE003FFC000FFE003FF8000FFE007FF0000FFE00FF -F0000FFE00FFE0000FFE00FFE0000FFE00FFE0000FFE00FFE0000FFE00FFE0001FFE00FF -F0001FFE007FF0003FFE007FF8007BFF803FFC00FBFFFE1FFF07F3FFFE0FFFFFE1FFFE03 -FFFF80FFFE00FFFF003FFE001FF80000002F2B7DA933>97 D<00FF0000000000FFFF0000 -000000FFFF0000000000FFFF0000000000FFFF0000000000FFFF000000000007FF000000 -000003FF000000000003FF000000000003FF000000000003FF000000000003FF00000000 -0003FF000000000003FF000000000003FF000000000003FF000000000003FF0000000000 -03FF000000000003FF000000000003FF000000000003FF000000000003FF000000000003 -FF00FFE0000003FF07FFFC000003FF1FFFFF800003FF7FFFFFC00003FFFF81FFF00003FF -FC003FF80003FFF0001FFC0003FFE0000FFE0003FFC00007FE0003FF800007FF0003FF80 -0003FF8003FF800003FF8003FF800003FFC003FF800001FFC003FF800001FFC003FF8000 -01FFC003FF800001FFE003FF800001FFE003FF800001FFE003FF800001FFE003FF800001 -FFE003FF800001FFE003FF800001FFE003FF800001FFE003FF800001FFE003FF800001FF -E003FF800001FFC003FF800001FFC003FF800003FFC003FF800003FF8003FF800003FF80 -03FF800003FF0003FF800007FF0003FFC00007FE0003FFE0000FFC0003FFF0001FF80003 -FFFC007FF00003FCFF01FFE00003F87FFFFFC00003F01FFFFF000003E007FFFC00000000 -01FFC0000033407DBE3A>I<00007FF0000007FFFF00001FFFFFC0007FFFFFE000FFF01F -F001FF800FF803FF001FF807FE003FFC0FFE003FFC1FFC003FFC1FFC003FFC3FF8003FFC -3FF8003FFC7FF8001FF87FF0000FF07FF00003C0FFF0000000FFF0000000FFF0000000FF -F0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0 -0000007FF00000007FF80000007FF80000007FF80000003FF800003E3FFC00003E1FFC00 -007E0FFE00007C07FF0000FC07FF8001F803FFC003F000FFF81FE0007FFFFFC0001FFFFF -800007FFFE0000007FF000272B7DA92E>I<0000000007F80000000007FFF80000000007 -FFF80000000007FFF80000000007FFF80000000007FFF800000000003FF800000000001F -F800000000001FF800000000001FF800000000001FF800000000001FF800000000001FF8 -00000000001FF800000000001FF800000000001FF800000000001FF800000000001FF800 -000000001FF800000000001FF800000000001FF800000000001FF80000007FF01FF80000 -07FFFE1FF800001FFFFF9FF800007FFFFFDFF80000FFF01FFFF80001FFC003FFF80003FF -0001FFF80007FE00007FF8000FFC00007FF8001FFC00003FF8001FF800003FF8003FF800 -003FF8003FF800003FF8007FF800003FF8007FF000003FF8007FF000003FF800FFF00000 -3FF800FFF000003FF800FFF000003FF800FFF000003FF800FFF000003FF800FFF000003F -F800FFF000003FF800FFF000003FF800FFF000003FF800FFF000003FF8007FF000003FF8 -007FF000003FF8007FF000003FF8007FF800003FF8003FF800003FF8003FF800003FF800 -1FFC00007FF8000FFC00007FF8000FFE0000FFF80007FF0003FFFC0003FF8007FFFFE001 -FFF03FFFFFE0007FFFFFBFFFE0003FFFFF3FFFE00007FFFC3FFFE00000FFE03FE0003340 -7DBE3A>I<0000FFF000000007FFFE0000001FFFFF8000007FFFFFC00000FFE07FE00001 -FF801FF00003FF000FF80007FE0007FC000FFC0003FE001FFC0003FE001FF80001FE003F -F80001FF003FF80001FF007FF00001FF007FF00000FF807FF00000FF80FFF00000FF80FF -F00000FF80FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF80FFF000000000FF -F000000000FFF000000000FFF000000000FFF0000000007FF0000000007FF0000000007F -F8000000003FF8000000003FF800000F801FFC00000F801FFC00001F800FFE00001F0007 -FF00003F0003FF80007E0001FFE001FC0000FFF80FF800003FFFFFF000001FFFFFC00000 -03FFFF000000007FF80000292B7DA930>I<000007FE0000007FFF800001FFFFC00007FF -FFE0000FFE3FF0001FF03FF0003FE07FF8007FC07FF800FFC07FF800FF807FF800FF807F -F801FF003FF001FF001FE001FF000FC001FF00000001FF00000001FF00000001FF000000 -01FF00000001FF00000001FF00000001FF00000001FF00000001FF000000FFFFFFE000FF -FFFFE000FFFFFFE000FFFFFFE000FFFFFFE00001FF80000001FF80000001FF80000001FF -80000001FF80000001FF80000001FF80000001FF80000001FF80000001FF80000001FF80 -000001FF80000001FF80000001FF80000001FF80000001FF80000001FF80000001FF8000 -0001FF80000001FF80000001FF80000001FF80000001FF80000001FF80000001FF800000 -01FF80000001FF80000001FF80000001FF80000001FF8000007FFFFF80007FFFFF80007F -FFFF80007FFFFF80007FFFFF800025407DBF20>I<0003FF8007F0003FFFF83FF8007FFF -FCFFFC01FFFFFFFFFE03FF83FFF9FE07FC007FC3FE0FF8003FE1FE1FF8003FF1FC1FF000 -1FF0F81FF0001FF0003FF0001FF8003FF0001FF8003FF0001FF8003FF0001FF8003FF000 -1FF8003FF0001FF8003FF0001FF8001FF0001FF0001FF0001FF0001FF8003FF0000FF800 -3FE00007FC007FC00003FF83FF800003FFFFFF000007FFFFFC000007BFFFF800000F03FF -8000000F00000000000F00000000001F80000000001F80000000001FC0000000001FF000 -0000000FFFFFFF00000FFFFFFFF0000FFFFFFFFC0007FFFFFFFF0007FFFFFFFF8003FFFF -FFFFC001FFFFFFFFE007FFFFFFFFE01FFFFFFFFFF03FE00003FFF07FC000003FF07F8000 -001FF8FF8000000FF8FF00000007F8FF00000007F8FF00000007F8FF00000007F8FF0000 -0007F87F8000000FF07FC000001FF03FC000001FE03FF000007FE01FFC0001FFC007FF80 -0FFF0003FFFFFFFE0000FFFFFFF800003FFFFFE0000001FFFC00002F3D7DA834>I<00FF -0000000000FFFF0000000000FFFF0000000000FFFF0000000000FFFF0000000000FFFF00 -0000000007FF000000000003FF000000000003FF000000000003FF000000000003FF0000 -00000003FF000000000003FF000000000003FF000000000003FF000000000003FF000000 -000003FF000000000003FF000000000003FF000000000003FF000000000003FF00000000 -0003FF000000000003FF001FF8000003FF00FFFE000003FF03FFFF800003FF07FFFFC000 -03FF0FE0FFE00003FF1F007FE00003FF3C007FF00003FF78007FF00003FFF0003FF80003 -FFE0003FF80003FFE0003FF80003FFC0003FF80003FFC0003FF80003FFC0003FF80003FF -80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80 -003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF8000 -3FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003F -F80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF8 -0003FF80003FF800FFFFFE0FFFFFE0FFFFFE0FFFFFE0FFFFFE0FFFFFE0FFFFFE0FFFFFE0 -FFFFFE0FFFFFE0333F7CBE3A>I<01F80003FC0007FE000FFF001FFF801FFF801FFF801F -FF801FFF801FFF800FFF0007FE0003FC0001F80000000000000000000000000000000000 -000000000000000000000000FF00FFFF00FFFF00FFFF00FFFF00FFFF0007FF0003FF0003 -FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003 -FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003 -FF0003FF0003FF0003FF00FFFFF8FFFFF8FFFFF8FFFFF8FFFFF815407CBF1D>I<00FF00 -00000000FFFF0000000000FFFF0000000000FFFF0000000000FFFF0000000000FFFF0000 -00000007FF000000000003FF000000000003FF000000000003FF000000000003FF000000 -000003FF000000000003FF000000000003FF000000000003FF000000000003FF00000000 -0003FF000000000003FF000000000003FF000000000003FF000000000003FF0000000000 -03FF000000000003FF000000000003FF000FFFFE0003FF000FFFFE0003FF000FFFFE0003 -FF000FFFFE0003FF000FFFFE0003FF0001FE000003FF0003FC000003FF0007F0000003FF -001FE0000003FF003FC0000003FF007F80000003FF00FF00000003FF03FC00000003FF07 -F800000003FF0FF000000003FF1FF000000003FF7FF800000003FFFFFC00000003FFFFFC -00000003FFFFFE00000003FFFFFF00000003FFE7FF80000003FFC3FFC0000003FF81FFC0 -000003FF00FFE0000003FF00FFF0000003FF007FF8000003FF003FFC000003FF001FFC00 -0003FF000FFE000003FF000FFF000003FF0007FF800003FF0003FFC00003FF0001FFC000 -03FF0000FFE000FFFFFC07FFFFC0FFFFFC07FFFFC0FFFFFC07FFFFC0FFFFFC07FFFFC0FF -FFFC07FFFFC0323F7DBE37>107 D<00FF00FFFF00FFFF00FFFF00FFFF00FFFF0007FF00 -03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 -03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 -03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 -03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 -03FF0003FF0003FF00FFFFFCFFFFFCFFFFFCFFFFFCFFFFFC163F7CBE1D>I<00FF001FF8 -0000FFC00000FFFF00FFFF0007FFF80000FFFF03FFFFC01FFFFE0000FFFF07FFFFE03FFF -FF0000FFFF0FE0FFF07F07FF8000FFFF1F003FF0F801FF800007FF3E003FF9F001FFC000 -03FF78003FFBC001FFC00003FFF0001FFF8000FFE00003FFF0001FFF8000FFE00003FFE0 -001FFF0000FFE00003FFC0001FFE0000FFE00003FFC0001FFE0000FFE00003FFC0001FFE -0000FFE00003FF80001FFC0000FFE00003FF80001FFC0000FFE00003FF80001FFC0000FF -E00003FF80001FFC0000FFE00003FF80001FFC0000FFE00003FF80001FFC0000FFE00003 -FF80001FFC0000FFE00003FF80001FFC0000FFE00003FF80001FFC0000FFE00003FF8000 -1FFC0000FFE00003FF80001FFC0000FFE00003FF80001FFC0000FFE00003FF80001FFC00 -00FFE00003FF80001FFC0000FFE00003FF80001FFC0000FFE00003FF80001FFC0000FFE0 -0003FF80001FFC0000FFE00003FF80001FFC0000FFE00003FF80001FFC0000FFE00003FF -80001FFC0000FFE00003FF80001FFC0000FFE00003FF80001FFC0000FFE000FFFFFE07FF -FFF03FFFFF80FFFFFE07FFFFF03FFFFF80FFFFFE07FFFFF03FFFFF80FFFFFE07FFFFF03F -FFFF80FFFFFE07FFFFF03FFFFF8051297CA858>I<00FF001FF80000FFFF00FFFE0000FF -FF03FFFF8000FFFF07FFFFC000FFFF0FE0FFE000FFFF1F007FE00007FF3C007FF00003FF -78007FF00003FFF0003FF80003FFE0003FF80003FFE0003FF80003FFC0003FF80003FFC0 -003FF80003FFC0003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF8000 -3FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003F -F80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF8 -0003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF800 -03FF80003FF80003FF80003FF80003FF80003FF800FFFFFE0FFFFFE0FFFFFE0FFFFFE0FF -FFFE0FFFFFE0FFFFFE0FFFFFE0FFFFFE0FFFFFE033297CA83A>I<00007FF000000003FF -FE0000001FFFFFC000007FFFFFF00000FFE03FF80001FF800FFC0003FE0003FE0007FC00 -01FF000FFC0001FF801FF80000FFC01FF80000FFC03FF80000FFE03FF000007FE07FF000 -007FF07FF000007FF07FF000007FF07FF000007FF0FFF000007FF8FFF000007FF8FFF000 -007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000 -007FF8FFF000007FF87FF000007FF07FF000007FF07FF000007FF07FF000007FF03FF800 -00FFE03FF80000FFE01FF80000FFC00FFC0001FF800FFC0001FF8007FE0003FF0003FF80 -0FFE0001FFE03FFC00007FFFFFF000001FFFFFC0000007FFFF000000007FF000002D2B7D -A934>I<00FF00FFE00000FFFF07FFFC0000FFFF1FFFFF8000FFFF7FFFFFC000FFFFFF81 -FFF000FFFFFC007FF80003FFF0003FFC0003FFE0001FFE0003FFC0000FFE0003FF800007 -FF0003FF800007FF8003FF800007FF8003FF800003FFC003FF800003FFC003FF800003FF -C003FF800001FFC003FF800001FFE003FF800001FFE003FF800001FFE003FF800001FFE0 -03FF800001FFE003FF800001FFE003FF800001FFE003FF800001FFE003FF800001FFE003 -FF800001FFE003FF800003FFC003FF800003FFC003FF800003FFC003FF800003FF8003FF -800007FF8003FF800007FF0003FF80000FFF0003FFC0000FFE0003FFE0001FFC0003FFF0 -003FF80003FFFC00FFF00003FFFF03FFE00003FFFFFFFFC00003FF9FFFFF000003FF87FF -FC000003FF81FFC0000003FF800000000003FF800000000003FF800000000003FF800000 -000003FF800000000003FF800000000003FF800000000003FF800000000003FF80000000 -0003FF800000000003FF800000000003FF8000000000FFFFFE00000000FFFFFE00000000 -FFFFFE00000000FFFFFE00000000FFFFFE00000000333B7DA83A>I<01FE01FE00FFFE07 -FF80FFFE0FFFE0FFFE1FFFF0FFFE3F1FF0FFFE7C3FF807FEF83FF803FEF03FF803FFE03F -F803FFE03FF803FFC01FF003FFC00FE003FF8007C003FF80000003FF80000003FF800000 -03FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003 -FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF -00000003FF00000003FF00000003FF00000003FF00000003FF000000FFFFFF0000FFFFFF -0000FFFFFF0000FFFFFF0000FFFFFF000025297DA82B>114 D<003FFC1E0001FFFFBE00 -07FFFFFE000FFFFFFE001FF00FFE003F8001FE007F0000FE007E00007E007E00007E00FE -00003E00FE00003E00FF00003E00FF80003E00FFC0000000FFF8000000FFFFE000007FFF -FF00007FFFFFC0003FFFFFF0001FFFFFF8000FFFFFFC0007FFFFFE0003FFFFFF0000FFFF -FF80001FFFFF800000FFFF80000007FFC0000000FFC07800007FC0F800003FC0F800001F -C0FC00001FC0FC00001FC0FE00001FC0FE00001F80FF00003F80FF80003F00FFE000FF00 -FFF803FE00FFFFFFFC00FFFFFFF000F87FFFC000E00FFE0000222B7DA929>I<0007C000 -0007C0000007C0000007C0000007C000000FC000000FC000000FC000000FC000001FC000 -001FC000001FC000003FC000007FC000007FC00000FFC00001FFC00007FFC0001FFFFFFE -FFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFE01FFC00001FFC00001FFC00001FFC00001FFC000 -01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 -01FFC00001FFC00001FFC00001FFC00001FFC00001FFC01F01FFC01F01FFC01F01FFC01F -01FFC01F01FFC01F01FFC01F01FFC01F01FFC01F00FFE03E00FFE03E007FE07E007FF8FC -003FFFF8001FFFF00007FFE00000FF80203B7EB929>I<00FF80000FF800FFFF800FFFF8 -00FFFF800FFFF800FFFF800FFFF800FFFF800FFFF800FFFF800FFFF80007FF80007FF800 -03FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003 -FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF -80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80 -003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF8000 -3FF80003FF80003FF80003FF80003FF80003FF80007FF80003FF80007FF80003FF80007F -F80003FF8000FFF80001FF8001FFF80001FF8003FFFC0000FFC007DFFFE000FFF01F9FFF -E0007FFFFF1FFFE0003FFFFE1FFFE0000FFFF81FFFE00001FFE01FE000332A7CA83A>I< -FFFFFC003FFFC0FFFFFC003FFFC0FFFFFC003FFFC0FFFFFC003FFFC0FFFFFC003FFFC001 -FFC00003E00001FFE00007E00001FFE00007E00000FFE00007C00000FFF0000FC000007F -F0000F8000007FF8001F8000003FF8001F0000003FFC003F0000001FFC003E0000001FFE -007E0000000FFE007C0000000FFF00FC0000000FFF00FC00000007FF00F800000007FF81 -F800000003FF81F000000003FFC3F000000001FFC3E000000001FFE7E000000000FFE7C0 -00000000FFFFC0000000007FFF80000000007FFF80000000007FFF80000000003FFF0000 -0000003FFF00000000001FFE00000000001FFE00000000000FFC00000000000FFC000000 -000007F8000000000007F8000000000003F0000000000003F000000032287EA737>IIII -E /Fn 88 127 df<1C007F00FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80 -FF80FF80FF80FF80FF80FF80FF807F007F007F007F007F007F007F007F007F007F007F00 -7F007F007F007F007F007F007F003E00000000000000000000000000000000001C007F00 -7F00FF80FF80FF807F007F001C0009396DB830>33 D<100004007C001F00FE003F80FE00 -3F80FF007F80FF007F80FE003F80FE003F80FE003F80FE003F80FE003F80FE003F80FE00 -3F80FE003F80FE003F80FE003F80FE003F80FE003F80FE003F80FE003F80FE003F80FE00 -3F80FE003F80FE003F807E003F007C001F003C001E0010000400191C75B830>I<0007C0 -07C0000007C007C000000FE00FE000000FE00FE000000FE00FE000000FE00FE000000FE0 -0FE000000FE00FE000000FE00FE000000FE00FE000001FE01FE000001FE01FE000001FC0 -1FC000001FC01FC000001FC01FC0007FFFFFFFFF007FFFFFFFFF00FFFFFFFFFF80FFFFFF -FFFF80FFFFFFFFFF807FFFFFFFFF003FFFFFFFFE00007F807F8000007F807F8000007F00 -7F0000007F007F0000007F007F0000007F007F0000007F007F0000007F007F0000007F00 -7F0000007F007F0000007F007F000000FF00FF000000FF00FF00003FFFFFFFFE007FFFFF -FFFF00FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF807FFFFFFFFF007FFFFFFFFF0001FC01 -FC000001FC01FC000001FC01FC000003FC03FC000003FC03FC000003F803F8000003F803 -F8000003F803F8000003F803F8000003F803F8000003F803F8000003F803F8000001F001 -F0000001F001F0000029387DB730>I<000038000000007C00000000FC00000000FC0000 -0000FC00000000FC00000003FF0000001FFFE00000FFFFFC0001FFFFFE0007FFFFFF000F -FFFFFF801FFEFDFFC01FF0FC3FE03FC0FC1FE07F80FC0FF07F00FC07F07E00FC07F8FE00 -FC03F8FC00FC03F8FC00FC07F8FC00FC07F8FC00FC07F8FE00FC03F0FE00FC03F07F00FC -00007F80FC00007FC0FC00003FF0FC00001FFEFC00001FFFFC00000FFFFF000007FFFFE0 -0001FFFFF800007FFFFC00001FFFFE000003FFFF000000FFFF800000FDFFC00000FC7FE0 -0000FC1FE00000FC0FF00000FC07F01800FC03F87E00FC03F87E00FC01F8FF00FC01F8FF -00FC01F8FF00FC01F8FE00FC01F8FE00FC01F8FF00FC03F07F00FC03F07F80FC07F07F80 -FC0FE03FC0FC1FE03FF0FC7FC01FFEFFFF800FFFFFFF0007FFFFFE0003FFFFFC0000FFFF -F000003FFFC0000007FE00000000FC00000000FC00000000FC00000000FC00000000FC00 -0000007C0000000038000025477BBE30>I<03C00001E0000FF00003E0001FF80007F000 -3FFC0007F0003FFC000FF0007FFE000FF0007E7E001FE000FE7F001FE000FE7F001FC000 -FC3F003FC000FC3F003FC000FC3F003F8000FC3F007F8000FC3F007F8000FC3F00FF0000 -FE7F00FF0000FE7F00FE00007E7E01FE00007FFE01FE00003FFC01FC00003FFC03FC0000 -1FF803FC00000FF007F8000003C007F80000000007F0000000000FF0000000000FF00000 -00000FE0000000001FE0000000001FE0000000003FC0000000003FC0000000003F800000 -00007F80000000007F80000000007F0000000000FF0000000000FF0000000001FE000000 -0001FE0000000001FC0000000003FC0000000003FC0000000003F80000000007F8000000 -0007F8000000000FF001E000000FF007F800000FE00FFC00001FE01FFE00001FE01FFE00 -001FC03FFF00003FC03FFF00003FC03F3F00007F807F3F80007F807E1F80007F007E1F80 -00FF007E1F8000FF007E1F8000FE007E1F8001FE007E1F8001FE007E1F8003FC007F3F80 -03FC003F3F0003F8003FFF0007F8003FFF0007F8001FFE0007F0001FFE0007F0000FFC00 -03E00007F80001E00001E00029477DBE30>I<0007E0000000001FF8000000003FFC0000 -00007FFC00000000FFFE00000000FFFF00000001FC7F00000001F83F00000001F83F8000 -0003F81F80000003F01F80000003F01F80000003F01F80000003F01F80000003F01F8000 -0003F01F80000003F03F80000003F03F00000003F07F0FFF0003F87E1FFF8001F8FE1FFF -8001F9FC1FFF8001FBFC1FFF8001FBF80FFF0001FFF00FC00000FFE00FC00000FFE01FC0 -0000FFC01F8000007F801F800000FF003F800001FF003F000003FF007F000007FF807E00 -000FFF807E00000FFF80FE00001FDFC0FC00003F8FE0FC00003F8FE1FC00007F07F1F800 -007F03F3F80000FE03FBF00000FE01FFF00000FE01FFE00000FE00FFE00000FE00FFC006 -00FE007FC00F00FE003F801F80FE003FC01F80FF007FC01F807F00FFE01F807F01FFF83F -807F87FFFC3F003FFFFBFFFF001FFFF1FFFE001FFFE0FFFE000FFFC03FFC0003FF001FF8 -0001FC0007E000293A7DB830>I<07C00FF01FF81FF81FFC1FFC1FFE0FFE07FE007E007E -007E007E007E00FE00FC00FC01FC01F803F807F00FF01FE07FE0FFC0FF80FF007C003800 -0F1D70B730>I<00001E00007F0000FF0001FF0003FE0007FC000FF0001FE0003FC0007F -8000FF0001FE0001FC0003FC0003F80007F0000FF0000FE0000FE0001FC0001FC0003FC0 -003F80003F80007F80007F00007F00007F00007F0000FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00007F00007F00007F00007F00 -007F80003F80003F80003FC0001FC0001FC0000FE0000FE0000FF00007F00003F80003FC -0001FC0001FE0000FF00007F80003FC0001FE0000FF00007FC0003FE0001FF0000FF0000 -7F00001E184771BE30>I<780000FE0000FF0000FF80007FC0003FE0000FF00007F80003 -FC0001FE0000FF00007F80003F80003FC0001FC0000FE0000FF00007F00007F00003F800 -03F80003FC0001FC0001FC0001FE0000FE0000FE0000FE0000FE00007F00007F00007F00 -007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0000FE0000FE00 -00FE0000FE0001FE0001FC0001FC0003FC0003F80003F80007F00007F0000FF0000FE000 -1FC0003FC0003F80007F8000FF0001FE0003FC0007F8000FF0003FE0007FC000FF8000FF -0000FE0000780000184778BE30>I<0000E000000001F000000003F800000003F8000000 -03F800000003F800000003F800000003F800003803F803807E03F80FC0FF83F83FE0FFC3 -F87FE0FFF3F9FFE07FFBFBFFC03FFFFFFF800FFFFFFE0003FFFFF80001FFFFF000007FFF -C000001FFF0000007FFFC00001FFFFF00003FFFFF8000FFFFFFE003FFFFFFF807FFBFBFF -C0FFF3F9FFE0FFC3F87FE0FF83F83FE07E03F80FC03803F803800003F800000003F80000 -0003F800000003F800000003F800000003F800000001F000000000E0000023277AAE30> -I<00003E00000000003E00000000007F00000000007F00000000007F00000000007F0000 -0000007F00000000007F00000000007F00000000007F00000000007F00000000007F0000 -0000007F00000000007F00000000007F00000000007F00000000007F0000007FFFFFFFFF -007FFFFFFFFF00FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF807FFFFFFFFF007FFFFFFFFF -0000007F00000000007F00000000007F00000000007F00000000007F00000000007F0000 -0000007F00000000007F00000000007F00000000007F00000000007F00000000007F0000 -0000007F00000000007F00000000007F00000000003E00000000003E00000029297DAF30 ->I<03E00FF01FF81FFC3FFE3FFE3FFF3FFF1FFF1FFF0FFF03FF007F007F007E00FE01FC -03FC07F83FF07FF0FFE07F807F003C001019708B30>I<7FFFFFFFF07FFFFFFFF0FFFFFF -FFF8FFFFFFFFF8FFFFFFFFF87FFFFFFFF07FFFFFFFF025077B9E30>I<0F003FC07FE07F -E0FFF0FFF0FFF0FFF07FE07FE03FC00F000C0C6E8B30>I<00000000F000000001F00000 -0003F800000003F800000007F800000007F80000000FF00000000FF00000001FE0000000 -1FE00000003FC00000003FC00000007F800000007F80000000FF00000000FF00000001FE -00000001FE00000001FC00000003FC00000003FC00000007F800000007F80000000FF000 -00000FF00000001FE00000001FE00000003FC00000003FC00000007F800000007F800000 -00FF00000000FF00000001FE00000001FE00000001FC00000003FC00000003FC00000007 -F800000007F80000000FF00000000FF00000001FE00000001FE00000003FC00000003FC0 -0000007F800000007F80000000FF00000000FF00000001FE00000001FE00000001FC0000 -0003FC00000003FC00000007F800000007F80000000FF00000000FF00000001FE0000000 -1FE00000003FC00000003FC00000007F800000007F80000000FF00000000FF00000000FE -00000000FE000000007C000000007C0000000025477BBE30>I<0000FE00000007FFC000 -000FFFE000003FFFF800007FFFFC0000FFFFFE0001FF83FF0003FE00FF8003FC007F8007 -F8003FC00FF0001FE00FE0000FE01FE0000FF01FC00007F01FC00007F03F800003F83F80 -0003F83F000001F87F000001FC7F000001FC7F000001FC7F000001FCFE000000FEFE0000 -00FEFE000000FEFE000000FEFE000000FEFE000000FEFE000000FEFE000000FEFE000000 -FEFE000000FEFE000000FEFE000000FEFE000000FEFF000001FE7F000001FC7F000001FC -7F000001FC7F800003FC3F800003F83F800003F83FC00007F81FC00007F01FC00007F01F -E0000FF00FF0001FE00FF0001FE007F8003FC003FC007F8003FE00FF8001FF83FF0000FF -FFFE00007FFFFC00003FFFF800000FFFE0000007FFC0000000FE0000273A7CB830>I<00 -03C0000007E0000007E000000FE000000FE000001FE000001FE000003FE000007FE00000 -FFE00003FFE0003FFFE000FFFFE000FFFFE000FFEFE000FF8FE0007E0FE000000FE00000 -0FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00000 -0FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00000 -0FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00000 -0FE000000FE000000FE000000FE000000FE000000FE0003FFFFFF87FFFFFFCFFFFFFFEFF -FFFFFE7FFFFFFC3FFFFFF81F3977B830>I<0007FC0000003FFFC00000FFFFF00003FFFF -F80007FFFFFE000FFFFFFF001FF80FFF803FE001FFC03FC0007FC07F80003FE07F00001F -E07F00000FF0FF000007F0FE000007F0FF000007F8FF000003F8FF000003F8FF000003F8 -7E000003F818000003F800000003F800000003F800000007F800000007F00000000FF000 -00000FE00000001FE00000001FC00000003FC00000007F80000000FF80000001FF000000 -01FE00000007FC0000000FF80000001FF00000003FE00000007FC0000000FF80000001FF -00000003FE00000007FC0000000FF00000003FE00000007FC0000000FF80000001FF0000 -0003FE0001F007FC0003F80FF80003F81FE00003F83FFFFFFFF8FFFFFFFFF8FFFFFFFFF8 -FFFFFFFFF87FFFFFFFF83FFFFFFFF025397BB830>I<0003FF0000003FFFE00000FFFFF8 -0001FFFFFE0003FFFFFF0007FFFFFF800FFE01FFC00FF0007FC01FE0001FE01FE0000FE0 -1FE0000FF01FE00007F01FE00007F00FC00007F007800007F000000007F00000000FF000 -00000FE00000000FE00000001FE00000003FC00000007FC0000000FF80000007FF000007 -FFFE00000FFFFC00000FFFF800000FFFFC00000FFFFF000007FFFF80000001FFC0000000 -3FE00000001FF000000007F800000003F800000003FC00000001FC00000001FE00000000 -FE00000000FE18000000FE7E000000FEFF000000FEFF000000FEFF000001FEFF000001FC -FE000003FCFF000003F87F800007F87FC0001FF03FF0003FF01FFE01FFE00FFFFFFFC007 -FFFFFF8003FFFFFE0000FFFFFC00003FFFF0000003FF8000273A7CB830>I<000003FC00 -00000007FE000000000FFE000000001FFE000000001FFE000000003FFE000000007FFE00 -0000007F7E00000000FE7E00000000FE7E00000001FC7E00000003F87E00000003F87E00 -000007F07E00000007F07E0000000FE07E0000001FC07E0000001FC07E0000003F807E00 -00003F807E0000007F007E000000FE007E000000FE007E000001FC007E000003F8007E00 -0003F8007E000007F0007E000007F0007E00000FE0007E00001FC0007E00001FC0007E00 -003F80007E00003F80007E00007F00007E0000FE00007E0000FFFFFFFFFF00FFFFFFFFFF -80FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF807FFFFFFFFF000000007E00000000007E00 -000000007E00000000007E00000000007E00000000007E00000000007E00000000007E00 -000000007E00000000007E000000007FFFFE000000FFFFFF000000FFFFFF000000FFFFFF -000000FFFFFF0000007FFFFE0029397DB830>I<0FFFFFFF801FFFFFFFC03FFFFFFFC03F -FFFFFFC03FFFFFFFC03FFFFFFF803F800000003F800000003F800000003F800000003F80 -0000003F800000003F800000003F800000003F800000003F800000003F800000003F8000 -00003F800000003F800000003F83FF00003F9FFFC0003FFFFFF0003FFFFFFC003FFFFFFE -003FFFFFFF003FFE03FF803FF0007FC03FE0003FC03F80001FE01F00000FE00E00000FF0 -00000007F000000007F000000007F800000003F800000003F800000003F818000003F87E -000003F87E000003F8FF000003F8FF000007F8FF000007F0FE00000FF0FF00000FE07F00 -001FE07F80003FC07FC0007FC03FE001FF801FFC0FFF000FFFFFFE0007FFFFFC0003FFFF -F80001FFFFE000007FFF8000000FFC000025397BB730>I<7C00000000FFFFFFFFFCFFFF -FFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFCFE00000FF8FE00000FF0FE0000 -1FE07C00003FC00000007F80000000FF00000000FF00000001FE00000003FC00000003F8 -00000007F800000007F00000000FF00000000FE00000001FC00000001FC00000003F8000 -00003F800000007F000000007F00000000FF00000000FE00000001FE00000001FC000000 -01FC00000003FC00000003F800000003F800000007F800000007F000000007F000000007 -F000000007F00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0 -0000001FE00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC000 -00001FC00000001FC00000001FC00000000F8000000007000000273A7CB830>55 -D<0F003FC07FE07FE0FFF0FFF0FFF0FFF07FE07FE03FC00F000000000000000000000000 -000000000000000000000000000000000000000F003FC07FE07FE0FFF0FFF0FFF0FFF07F -E07FE03FC00F000C276EA630>58 D<03C00FF01FF81FF83FFC3FFC3FFC3FFC1FF81FF80F -F003C000000000000000000000000000000000000000000000000000000000000003C00F -F01FF01FF83FF83FFC3FFC3FFC1FFC1FFC0FFC03FC00FC01FC01F803F803F007F01FE03F -E07FC0FF807F007E0038000E3470A630>I<00000000F000000003F000000007F8000000 -1FF80000007FF8000000FFF0000003FFF0000007FFC000001FFF8000003FFE000000FFF8 -000001FFF0000007FFC000000FFF8000003FFE0000007FFC000001FFF0000003FFE00000 -0FFF8000001FFF0000007FFC0000007FF8000000FFE0000000FFC0000000FFE00000007F -F80000007FFC0000001FFF0000000FFF80000003FFE0000001FFF00000007FFC0000003F -FE0000000FFF80000007FFC0000001FFF0000000FFF80000003FFE0000001FFF80000007 -FFC0000003FFF0000000FFF00000007FF80000001FF800000007F800000003F000000000 -F0252F7BB230>I<7FFFFFFFFF007FFFFFFFFF00FFFFFFFFFF80FFFFFFFFFF80FFFFFFFF -FF807FFFFFFFFF003FFFFFFFFE0000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000003FFFFFFFFE007FFFFFFFFF00FFFFFFFF -FF80FFFFFFFFFF80FFFFFFFFFF807FFFFFFFFF007FFFFFFFFF0029157DA530>I<780000 -00007E00000000FF00000000FFC0000000FFE00000007FF80000007FFE0000001FFF0000 -000FFFC0000003FFE0000001FFF80000007FFC0000001FFF0000000FFF80000003FFE000 -0001FFF00000007FFC0000003FFE0000000FFF80000007FFC0000001FFF0000000FFF000 -00003FF80000001FF80000003FF8000000FFF0000001FFF0000007FFC000000FFF800000 -3FFE0000007FFC000001FFF0000003FFE000000FFF8000001FFF0000007FFC000001FFF8 -000003FFE000000FFFC000001FFF0000007FFE0000007FF8000000FFE0000000FFC00000 -00FF000000007E000000007800000000252F7BB230>I<001FFE000000FFFFE00003FFFF -F8000FFFFFFE001FFFFFFF003FFFFFFF807FF803FFC07FC0007FC0FF00001FC0FF00001F -E0FF00000FE0FF00000FE0FF00000FE07E00000FE07E00001FE01800007FC0000000FFC0 -000003FF80000007FF0000000FFE0000001FF80000003FF00000007FC0000000FF800000 -00FF00000001FE00000001FE00000003FC00000003F800000003F800000007F800000007 -F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0 -00000003E000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000001C000000007F000000007F00000000FF80000000FF80000 -000FF800000007F000000007F000000001C0000023397AB830>I<00001FE0000000FFF8 -000003FFFE00000FFFFF00001FFFFF80003FFFFFC0007FF03FE000FF800FE001FF0007F0 -03FC0003F007F801FBF807F007FFF80FE01FFFF80FE03FFFFC1FC03FFFFC1F807FFFFC3F -80FF0FFC3F00FE07FC3F01FC03FE7F01F801FE7E03F801FE7E03F000FE7E03F000FEFE07 -F000FEFC07E0007EFC07E0007EFC07E0007EFC07E0007EFC07E0007EFC07E0007EFC07E0 -007EFC07E0007EFC07E0007EFC07E0007EFE07F000FE7E03F000FC7E03F000FC7E03F801 -FC7F01F801F83F01FC03F83F00FE07F03F80FF0FF01F807FFFE01FC03FFFC00FE03FFFC0 -0FE01FFF8007F007FE0007F801F80003FC00007C01FF0000FE00FF8003FE007FF01FFE00 -3FFFFFFC001FFFFFF8000FFFFFE00003FFFFC00000FFFE0000001FF000273A7CB830>I< -00007F0000000000FF8000000000FF8000000001FFC000000001FFC000000001FFC00000 -0001FFC000000003FFE000000003F7E000000003F7E000000003F7E000000003F7E00000 -0007F7F000000007E3F000000007E3F000000007E3F00000000FE3F80000000FE3F80000 -000FE3F80000000FC1F80000000FC1F80000001FC1FC0000001FC1FC0000001FC1FC0000 -001FC1FC0000003F80FE0000003F80FE0000003F80FE0000003F80FE0000003F80FE0000 -007F007F0000007F007F0000007F007F0000007F007F000000FF007F800000FE003F8000 -00FFFFFF800000FFFFFF800000FFFFFF800001FFFFFFC00001FFFFFFC00001FFFFFFC000 -01FC001FC00003FC001FE00003F8000FE00003F8000FE00003F8000FE00003F8000FE000 -07F8000FF00007F00007F00007F00007F0007FFF007FFF00FFFF80FFFF80FFFF80FFFF80 -FFFF80FFFF80FFFF80FFFF807FFF007FFF0029397DB830>I<7FFFFFF00000FFFFFFFE00 -00FFFFFFFF8000FFFFFFFFC000FFFFFFFFE0007FFFFFFFF00003F8001FF80003F80007F8 -0003F80003FC0003F80001FC0003F80001FC0003F80000FE0003F80000FE0003F80000FE -0003F80000FE0003F80000FE0003F80000FE0003F80001FE0003F80001FC0003F80001FC -0003F80003F80003F80007F80003F8001FF00003F8007FE00003FFFFFFC00003FFFFFF80 -0003FFFFFE000003FFFFFF800003FFFFFFE00003FFFFFFF00003F8000FF80003F80003FC -0003F80001FE0003F80000FE0003F800007F0003F800007F0003F800007F0003F800003F -8003F800003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800007F -8003F800007F0003F800007F0003F80000FF0003F80001FE0003F80003FE0003F8001FFC -007FFFFFFFFC00FFFFFFFFF800FFFFFFFFF000FFFFFFFFC000FFFFFFFF80007FFFFFFC00 -0029387EB730>I<00007F803C0003FFF03E0007FFFC7E001FFFFE7E003FFFFFFE007FFF -FFFE00FFE07FFE01FF801FFE03FE000FFE07FC0007FE07F80007FE0FF00003FE0FF00003 -FE1FE00001FE1FC00001FE3FC00001FE3F800000FE3F800000FE7F800000FE7F000000FE -7F0000007C7F00000000FF00000000FE00000000FE00000000FE00000000FE00000000FE -00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 -000000FF000000007F000000007F000000007F0000007C7F800000FE3F800000FE3F8000 -00FE3FC00000FE1FC00000FE1FE00001FE0FF00001FC0FF00001FC07F80003F807FC0007 -F803FE000FF001FF801FF000FFE07FE0007FFFFFC0003FFFFF80001FFFFF000007FFFC00 -0003FFF00000007FC000273A7CB830>I<3FFFFFE000007FFFFFFC0000FFFFFFFE0000FF -FFFFFF80007FFFFFFFC0003FFFFFFFE00003F8007FF00003F8001FF80003F8000FF80003 -F80007FC0003F80003FE0003F80001FE0003F80000FF0003F80000FF0003F800007F8003 -F800007F8003F800003F8003F800003FC003F800001FC003F800001FC003F800001FC003 -F800001FC003F800000FE003F800000FE003F800000FE003F800000FE003F800000FE003 -F800000FE003F800000FE003F800000FE003F800000FE003F800000FE003F800000FE003 -F800000FE003F800001FE003F800001FC003F800001FC003F800001FC003F800003FC003 -F800003F8003F800003F8003F800007F8003F800007F0003F80000FF0003F80001FE0003 -F80003FE0003F80007FC0003F8000FFC0003F8001FF80003F8007FF0003FFFFFFFE0007F -FFFFFFC000FFFFFFFF8000FFFFFFFF00007FFFFFFC00003FFFFFE000002B387FB730>I< -7FFFFFFFFF00FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF807FFFFFFFFF80 -03F800003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800003F80 -03F800003F8003F800003F8003F800001F0003F80000000003F80000000003F800000000 -03F80000000003F8007C000003F800FE000003F800FE000003F800FE000003F800FE0000 -03FFFFFE000003FFFFFE000003FFFFFE000003FFFFFE000003FFFFFE000003FFFFFE0000 -03F800FE000003F800FE000003F800FE000003F800FE000003F8007C000003F800000000 -03F80000000003F80000000003F80000000003F80000000003F8000007C003F800000FE0 -03F800000FE003F800000FE003F800000FE003F800000FE003F800000FE003F800000FE0 -03F800000FE003F800000FE07FFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0 -FFFFFFFFFFE07FFFFFFFFFC02B387EB730>I<3FFFFFFFFF807FFFFFFFFFC0FFFFFFFFFF -C0FFFFFFFFFFC07FFFFFFFFFC03FFFFFFFFFC001FC00001FC001FC00001FC001FC00001F -C001FC00001FC001FC00001FC001FC00001FC001FC00001FC001FC00001FC001FC00000F -8001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC003E00 -0001FC007F000001FC007F000001FC007F000001FC007F000001FFFFFF000001FFFFFF00 -0001FFFFFF000001FFFFFF000001FFFFFF000001FFFFFF000001FC007F000001FC007F00 -0001FC007F000001FC007F000001FC003E000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC000000003FFFF80000 -007FFFFC000000FFFFFC000000FFFFFC0000007FFFFC0000003FFFF80000002A387EB730 ->I<0000FF00F0000003FFC0F800000FFFF1F800003FFFFDF800007FFFFFF80000FFFFFF -F80001FFC1FFF80001FF007FF80003FE003FF80007FC001FF80007F8000FF8000FF0000F -F8000FE00007F8001FE00007F8001FC00007F8003FC00007F8003F800003F8003F800003 -F8007F800003F8007F000003F8007F000001F0007F0000000000FF0000000000FE000000 -0000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE000000 -0000FE0000000000FE0000FFFF00FE0001FFFF80FE0003FFFF80FE0003FFFF80FF0001FF -FF807F0000FFFF007F000003F8007F000003F8007F800003F8003F800007F8003F800007 -F8003FC00007F8001FC00007F8001FE0000FF8000FE0000FF8000FF0000FF80007F8001F -F80007F8001FF80003FE003FF80001FF007FF80001FFC1FFF80000FFFFFFF800007FFFFF -F800003FFFFBF800000FFFF3F8000003FFC1F0000000FF000000293A7DB830>I<3FFF80 -0FFFE07FFFC01FFFF0FFFFE03FFFF8FFFFE03FFFF87FFFC01FFFF03FFF800FFFE003F800 -00FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F800 -00FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F800 -00FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003FFFF -FFFE0003FFFFFFFE0003FFFFFFFE0003FFFFFFFE0003FFFFFFFE0003FFFFFFFE0003F800 -00FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F800 -00FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F800 -00FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE0003F800 -00FE0003F80000FE003FFF800FFFE07FFFC01FFFF0FFFFE03FFFF8FFFFE03FFFF87FFFC0 -1FFFF03FFF800FFFE02D387FB730>I<7FFFFFFF00FFFFFFFF80FFFFFFFF80FFFFFFFF80 -FFFFFFFF807FFFFFFF000007F000000007F000000007F000000007F000000007F0000000 -07F000000007F000000007F000000007F000000007F000000007F000000007F000000007 -F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0 -00000007F000000007F000000007F000000007F000000007F000000007F000000007F000 -000007F000000007F000000007F000000007F000000007F000000007F000000007F00000 -0007F000000007F000000007F000000007F000000007F000000007F000000007F0000000 -07F000000007F000000007F000007FFFFFFF00FFFFFFFF80FFFFFFFF80FFFFFFFF80FFFF -FFFF807FFFFFFF00213879B730>I<0001FFFFF00003FFFFF80007FFFFF80007FFFFF800 -03FFFFF80001FFFFF0000000FE00000000FE00000000FE00000000FE00000000FE000000 -00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000 -FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE -00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 -000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 -0000FE00000000FE00000000FE003C0000FE007E0000FE00FF0000FE00FF0000FE00FF00 -01FC00FF0003FC00FF8007FC007FF01FF8003FFFFFF0003FFFFFE0001FFFFFC00007FFFF -800001FFFE0000003FF0000025397AB730>I<3FFFF80000007FFFFC000000FFFFFE0000 -00FFFFFE0000007FFFFC0000003FFFF800000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC00000F8001FC00001FC001FC00001FC001FC00001FC001FC00001F -C001FC00001FC001FC00001FC001FC00001FC001FC00001FC001FC00001FC03FFFFFFFFF -C07FFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC07FFFFFFFFFC03FFFFFFFFF802A387EB730 ->76 D<3FF80000FFE07FFC0001FFF0FFFE0003FFF8FFFE0003FFF87FFE0003FFF03FFF00 -07FFE007FF0007FF0007EF0007BF0007EF800FBF0007EF800FBF0007EF800FBF0007E7C0 -1F3F0007E7C01F3F0007E7C01F3F0007E7C01F3F0007E7E03F3F0007E3E03E3F0007E3E0 -3E3F0007E3F07E3F0007E3F07E3F0007E1F07C3F0007E1F07C3F0007E1F8FC3F0007E1F8 -FC3F0007E0F8F83F0007E0F8F83F0007E0FDF83F0007E07DF03F0007E07DF03F0007E07D -F03F0007E07FF03F0007E03FE03F0007E03FE03F0007E03FE03F0007E01FC03F0007E01F -C03F0007E007003F0007E000003F0007E000003F0007E000003F0007E000003F0007E000 -003F0007E000003F0007E000003F0007E000003F0007E000003F0007E000003F0007E000 -003F0007E000003F0007E000003F003FFC0001FFE07FFE0003FFF0FFFF0007FFF8FFFF00 -07FFF87FFE0003FFF03FFC0001FFE02D387FB730>I<3FFC001FFF807FFE003FFFC0FFFF -007FFFE0FFFF007FFFE07FFF803FFFC03FFF801FFF8003FF8001F80003F7C001F80003F7 -C001F80003F7C001F80003F3E001F80003F3E001F80003F3E001F80003F3F001F80003F1 -F001F80003F1F001F80003F1F801F80003F1F801F80003F0F801F80003F0FC01F80003F0 -FC01F80003F07C01F80003F07E01F80003F07E01F80003F03E01F80003F03F01F80003F0 -3F01F80003F01F01F80003F01F01F80003F01F81F80003F01F81F80003F00F81F80003F0 -0FC1F80003F00FC1F80003F007C1F80003F007E1F80003F007E1F80003F003E1F80003F0 -03F1F80003F003F1F80003F001F1F80003F001F1F80003F001F9F80003F000F9F80003F0 -00F9F80003F000F9F80003F0007DF80003F0007DF80003F0007DF80003F0003FF8003FFF -003FF8007FFF803FF800FFFFC01FF800FFFFC01FF8007FFF800FF8003FFF0007F0002B38 -7EB730>I<003FFFE00001FFFFFC0007FFFFFF000FFFFFFF801FFFFFFFC03FFFFFFFE03F -F800FFE03FE0003FE07F80000FF07F80000FF07F000007F07F000007F07F000007F07F00 -0007F0FF000007F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE0000 -03F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003 -F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8 -FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FF -000007F8FF000007F87F000007F07F000007F07F000007F07F80000FF07F80000FF07FC0 -001FF03FE0003FE03FF800FFE03FFFFFFFE01FFFFFFFC00FFFFFFF8007FFFFFF0001FFFF -FC00003FFFE000253A7BB830>I<7FFFFFF00000FFFFFFFE0000FFFFFFFF8000FFFFFFFF -E000FFFFFFFFF0007FFFFFFFF80003F8003FF80003F8000FFC0003F80003FE0003F80001 -FE0003F80000FF0003F80000FF0003F800007F0003F800007F8003F800003F8003F80000 -3F8003F800003F8003F800003F8003F800003F8003F800003F8003F800007F8003F80000 -7F0003F80000FF0003F80000FF0003F80001FE0003F80003FE0003F8000FFC0003F8003F -F80003FFFFFFF80003FFFFFFF00003FFFFFFE00003FFFFFF800003FFFFFE000003FFFFF0 -000003F80000000003F80000000003F80000000003F80000000003F80000000003F80000 -000003F80000000003F80000000003F80000000003F80000000003F80000000003F80000 -000003F80000000003F80000000003F80000000003F8000000007FFFC0000000FFFFE000 -0000FFFFE0000000FFFFE0000000FFFFE00000007FFFC000000029387EB730>I<3FFFFF -8000007FFFFFF00000FFFFFFFC0000FFFFFFFF00007FFFFFFF80003FFFFFFFC00003F801 -FFE00003F8003FF00003F8001FF00003F8000FF80003F80007F80003F80003F80003F800 -03FC0003F80001FC0003F80001FC0003F80001FC0003F80001FC0003F80001FC0003F800 -03FC0003F80003F80003F80007F80003F8000FF80003F8001FF00003F8003FF00003F801 -FFE00003FFFFFFC00003FFFFFF800003FFFFFF000003FFFFFE000003FFFFFF000003FFFF -FF800003F800FFC00003F8003FE00003F8001FE00003F8000FE00003F8000FF00003F800 -07F00003F80007F00003F80007F00003F80007F00003F80007F00003F80007F00003F800 -07F00003F80007F00003F80007F0F803F80007F1FC03F80007F1FC03F80007F1FC03F800 -07F1FC03F80007F1FC3FFF8003FBFC7FFFC003FFF8FFFFE001FFF8FFFFE001FFF07FFFC0 -00FFE03FFF80007FC0000000001F002E397FB730>82 D<000FF803C0007FFF03E001FFFF -C7E003FFFFF7E007FFFFFFE00FFFFFFFE01FF80FFFE03FE001FFE03FC000FFE07F80007F -E07F00003FE0FF00003FE0FE00001FE0FE00001FE0FE00000FE0FE00000FE0FE00000FE0 -FF00000FE0FF000007C07F000000007F800000007FC00000003FF00000001FFE0000001F -FFF000000FFFFF000007FFFFE00001FFFFF80000FFFFFC00001FFFFF000003FFFF800000 -3FFFC0000001FFC00000007FE00000001FE00000000FF00000000FF000000007F8000000 -07F87C000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FF000007 -F8FF000007F0FF800007F0FFC0000FE0FFE0001FE0FFF8003FC0FFFF00FFC0FFFFFFFF80 -FFFFFFFF00FDFFFFFE00FC7FFFF800F81FFFF0007801FF8000253A7BB830>I<3FFFFFFF -FFC07FFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0FE003F80 -0FE0FE003F800FE0FE003F800FE0FE003F800FE0FE003F800FE0FE003F800FE0FE003F80 -0FE0FE003F800FE07C003F8007C000003F80000000003F80000000003F80000000003F80 -000000003F80000000003F80000000003F80000000003F80000000003F80000000003F80 -000000003F80000000003F80000000003F80000000003F80000000003F80000000003F80 -000000003F80000000003F80000000003F80000000003F80000000003F80000000003F80 -000000003F80000000003F80000000003F80000000003F80000000003F80000000003F80 -000000003F80000000003F80000000003F80000000003F80000000003F80000000003F80 -000000003F800000001FFFFF0000003FFFFF8000003FFFFF8000003FFFFF8000003FFFFF -8000001FFFFF00002B387EB730>I<7FFFC007FFFCFFFFE00FFFFEFFFFE00FFFFEFFFFE0 -0FFFFEFFFFE00FFFFE7FFFC007FFFC03F800003F8003F800003F8003F800003F8003F800 -003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800 -003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800 -003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800 -003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800 -003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800 -003F8003F800003F8003FC00007F8001FC00007F0001FC00007F0001FC00007F0000FE00 -00FE0000FF0001FE00007F0001FC00007F8003FC00003FE00FF800001FF83FF000000FFF -FFE0000007FFFFC0000003FFFF80000001FFFF000000007FFC000000001FF000002F3980 -B730>I<7FFE000FFFC0FFFF001FFFE0FFFF803FFFE0FFFF803FFFE0FFFF001FFFE07FFE -000FFFC007F00001FC0007F00001FC0007F80003FC0003F80003F80003F80003F80003F8 -0003F80003F80003F80001FC0007F00001FC0007F00001FC0007F00001FC0007F00000FE -000FE00000FE000FE00000FE000FE00000FE000FE00000FF001FE000007F001FC000007F -001FC000007F001FC000007F803FC000003F803F8000003F803F8000003F803F8000003F -803F8000001FC07F0000001FC07F0000001FC07F0000001FC07F0000000FE0FE0000000F -E0FE0000000FE0FE0000000FE0FE00000007E0FC00000007F1FC00000007F1FC00000007 -F1FC00000003F1F800000003F1F800000003F1F800000003FBF800000001FBF000000001 -FBF000000001FBF000000001FFF000000001FFF000000000FFE000000000FFE000000000 -FFE000000000FFE0000000007FC0000000003F8000002B397EB730>I<3FFC0001FFE07F -FE0003FFF0FFFE0003FFF8FFFE0003FFF87FFE0003FFF03FFC0001FFE01FC000001FC00F -C000001F800FC000001F800FC000001F800FC000001F800FC000001F800FC000001F800F -C000001F800FE000003F8007E000003F0007E000003F0007E000003F0007E000003F0007 -E000003F0007E000003F0007E000003F0003E00F803E0003F01FC07E0003F03FE07E0003 -F03FE07E0003F03FE07E0003F07FF07E0003F07FF07E0003F07DF07E0001F07DF07C0001 -F07DF07C0001F8FDF8FC0001F8FDF8FC0001F8FDF8FC0001F8F8F8FC0001F8F8F8FC0001 -F8F8F8FC0000F8F8F8F80000F9F8FCF80000F9F8FCF80000F9F07CF80000F9F07CF80000 -FDF07DF80000FDF07DF800007DF07DF000007DE03DF000007DE03DF000007DE03DF00000 -7FE03FF000007FE03FF000007FC01FF000007FC01FF000003FC01FE000003FC01FE00000 -3F800FE000001F0007C0002D397FB730>I<3FFF01FFF8007FFF83FFFC007FFFC7FFFE00 -7FFFC7FFFE007FFF83FFFC003FFF01FFF80001FC007F800001FE007F000000FE00FF0000 -00FF00FE0000007F01FE0000007F81FC0000003F83FC0000003FC3FC0000001FC3F80000 -001FE7F80000000FE7F00000000FFFF000000007FFE000000007FFE000000003FFC00000 -0003FFC000000001FF8000000001FF8000000000FF0000000000FF0000000000FF000000 -0000FF0000000001FF8000000001FF8000000003FFC000000003FFC000000003FFE00000 -0007FFE000000007FFF00000000FE7F00000000FE7F80000001FC3F80000001FC3FC0000 -003F81FC0000003F81FE0000007F00FE0000007F00FF000000FF007F000000FE007F8000 -01FE003F800001FC003FC00003FC001FC00003F8001FE00007F8000FE0007FFE007FFF00 -FFFF00FFFF80FFFF80FFFF80FFFF80FFFF80FFFF00FFFF807FFE007FFF0029387DB730> -I<1FFFFFFFFC3FFFFFFFFE7FFFFFFFFE7FFFFFFFFE7FFFFFFFFE7FFFFFFFFE7F000003FC -7F000007F87F000007F07F00000FF07F00001FE07F00001FC07F00003FC07F00007F803E -00007F00000000FF00000001FE00000001FC00000003FC00000007F800000007F0000000 -0FF00000001FE00000001FC00000003FC00000007F800000007F00000000FF00000001FE -00000001FC00000003FC00000007F800000007F00000000FF00000001FE00000001FC000 -00003FC00000007F800000007F00000000FF00000001FE00007C01FC0000FE03FC0000FE -07F80000FE07F00000FE0FF00000FE1FE00000FE1FC00000FE3FC00000FE7F800000FE7F -FFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE7FFFFFFFFC27387CB730>90 -D<7FFFFF00FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF00FE000000FE000000FE0000 -00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 -00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 -00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 -00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 -00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 -00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 -00FE000000FE000000FFFFFF00FFFFFF80FFFFFF80FFFFFF80FFFFFF807FFFFF0019476D -BE30>I<7C000000007C00000000FE00000000FE00000000FF00000000FF000000007F80 -0000007F800000003FC00000003FC00000001FE00000001FE00000000FF00000000FF000 -000007F800000007F800000003FC00000003FC00000001FC00000001FE00000001FE0000 -0000FF00000000FF000000007F800000007F800000003FC00000003FC00000001FE00000 -001FE00000000FF00000000FF000000007F800000007F800000003FC00000003FC000000 -01FC00000001FE00000001FE00000000FF00000000FF000000007F800000007F80000000 -3FC00000003FC00000001FE00000001FE00000000FF00000000FF000000007F800000007 -F800000003FC00000003FC00000001FC00000001FE00000001FE00000000FF00000000FF -000000007F800000007F800000003FC00000003FC00000001FE00000001FE00000000FF0 -0000000FF000000007F800000007F800000003F800000003F800000001F000000000F025 -477BBE30>I<7FFFFF00FFFFFF80FFFFFF80FFFFFF80FFFFFF807FFFFF8000003F800000 -3F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F800000 -3F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F800000 -3F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F800000 -3F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F800000 -3F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F800000 -3F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F800000 -3F8000003F8000003F8000003F807FFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF807FFF -FF0019477DBE30>I<00070000001FC000007FF00000FFF80003FFFE000FFFFF803FFFFF -E07FFDFFF0FFF07FF8FFC01FF8FF800FF8FE0003F87C0001F0100000401D0E77B730>I< -7FFFFFFFF07FFFFFFFF0FFFFFFFFF8FFFFFFFFF8FFFFFFFFF87FFFFFFFF07FFFFFFFF025 -077B7D30>I<0038007C01FE03FE07FE0FFC0FF01FE01FC03F803F007F007E007E00FE00 -FC00FC00FC00FC00FC00FFC0FFE0FFF07FF07FF03FF03FF01FE007C00F1D70BE30>I<00 -3FFC00000001FFFF80000003FFFFE0000007FFFFF000000FFFFFF800001FFFFFFC00001F -F00FFE00001FE001FF00001FE000FF00001FE0007F80000FC0003F80000780003FC00000 -00001FC0000000001FC0000000001FC0000000001FC0000000FFFFC000000FFFFFC00000 -7FFFFFC00001FFFFFFC00007FFFFFFC0000FFFFFFFC0001FFFC01FC0003FFC001FC0007F -E0001FC0007F80001FC000FF00001FC000FE00001FC000FE00001FC000FE00001FC000FE -00001FC000FF00003FC000FF00003FC0007F80007FC0007FC001FFC0003FF80FFFFFC01F -FFFFFFFFE01FFFFFFFFFE007FFFFF7FFE003FFFFC3FFE000FFFF00FFC0003FF00000002B -2A7CA830>I<3FFC000000007FFE00000000FFFE00000000FFFE000000007FFE00000000 -3FFE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE00000000 -00FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE03FE0000 -00FE1FFF800000FE7FFFE00000FEFFFFF00000FFFFFFFC0000FFFFFFFE0000FFFE07FE00 -00FFF001FF0000FFE000FF8000FFC0007F8000FF80003FC000FF00001FC000FE00001FE0 -00FE00000FE000FE00000FE000FE00000FF000FE000007F000FE000007F000FE000007F0 -00FE000007F000FE000007F000FE000007F000FE000007F000FE000007F000FE00000FF0 -00FE00000FF000FE00000FE000FF00000FE000FF00001FE000FF80003FC000FF80003FC0 -00FFC0007F8000FFE000FF8000FFF003FF0000FFFC0FFE0000FFFFFFFC0000FFFFFFF800 -00FEFFFFF000007E7FFFC000003C1FFF0000000003FC00002C3980B730>I<0000FFE000 -0007FFFC00001FFFFE00007FFFFF0000FFFFFF8001FFFFFFC003FF807FC007FC003FC00F -F8003FC01FF0003FC01FE0001F803FC0000F003F800000007F800000007F000000007F00 -000000FF00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 -0000FE00000000FE00000000FF000000007F000000007F000000007F800000003F800007 -C03FC0000FE01FE0000FE01FF0001FE00FF8001FC007FE003FC007FFC0FF8003FFFFFF80 -00FFFFFF00007FFFFE00001FFFF8000007FFF0000001FF8000232A7AA830>I<000001FF -E000000003FFF000000007FFF000000007FFF000000003FFF000000001FFF00000000007 -F00000000007F00000000007F00000000007F00000000007F00000000007F00000000007 -F00000000007F00000000007F00000000007F0000003FE07F000001FFF87F000003FFFE7 -F00000FFFFFFF00001FFFFFFF00003FFFFFFF00007FF03FFF0000FFC00FFF0001FF0003F -F0001FE0001FF0003FC0001FF0003FC0000FF0007F800007F0007F000007F0007F000007 -F000FF000007F000FF000007F000FE000007F000FE000007F000FE000007F000FE000007 -F000FE000007F000FE000007F000FE000007F000FE000007F000FF000007F0007F00000F -F0007F00000FF0007F80000FF0003F80001FF0003FC0003FF0001FE0003FF0001FF0007F -F0000FF801FFF00007FE07FFFFC003FFFFFFFFE001FFFFFFFFF000FFFFF7FFF0007FFFC7 -FFE0001FFF03FFC00007FC0000002C397DB730>I<0001FF00000007FFE000001FFFF800 -007FFFFC0000FFFFFE0001FFFFFF0003FF81FF8007FC007FC00FF8003FC01FE0001FE01F -E0000FE03FC0000FF03F800007F07F800007F07F000007F07F000003F8FF000003F8FE00 -0003F8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF0FE0000 -0000FF000000007F000000007F000000007F800000003F800001F03FC00003F81FE00003 -F80FF00003F80FF80007F807FE001FF003FFC07FE001FFFFFFE000FFFFFFC0003FFFFF80 -001FFFFE000007FFF8000000FFC000252A7CA830>I<000000FF80000007FFE000001FFF -F000003FFFF000007FFFF80000FFFFF80001FF87F80003FE07F80003FC03F00007F800C0 -0007F000000007F000000007F000000007F000000007F000000007F000000007F0000000 -07F000003FFFFFFFC07FFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE07FFFFFFFC00007 -F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0 -00000007F000000007F000000007F000000007F000000007F000000007F000000007F000 -000007F000000007F000000007F000000007F000000007F000000007F000000007F00000 -0007F000000007F000000007F000000007F000000007F000003FFFFFFE007FFFFFFF00FF -FFFFFF80FFFFFFFF807FFFFFFF003FFFFFFE0025397DB830>I<0003FC00FF00001FFF87 -FFC0003FFFDFFFC000FFFFFFFFE001FFFFFFFFE003FFFFFFFFE007FE07FF8FE007F801FE -07C00FF000FF00000FF000FF00000FE0007F00001FE0007F80001FC0003F80001FC0003F -80001FC0003F80001FC0003F80001FC0003F80001FE0007F80000FE0007F00000FF000FF -00000FF000FF000007F801FE000007FE07FE000007FFFFFC000007FFFFF800000FFFFFF0 -00000FFFFFC000000FDFFF8000000FC3FC0000000FC0000000000FC0000000000FC00000 -00000FE0000000000FF00000000007FFFFF0000007FFFFFF000003FFFFFFC00007FFFFFF -F0000FFFFFFFF8001FFFFFFFFC003FE0001FFE003F800001FE007F0000007F007E000000 -3F00FE0000003F80FC0000001F80FC0000001F80FC0000001F80FC0000001F80FC000000 -1F80FE0000003F807F0000007F007F800000FF003FC00001FE003FF00007FE001FFF007F -FC000FFFFFFFF80007FFFFFFF00001FFFFFFC000007FFFFF0000001FFFFC00000001FFC0 -00002B3E7DA730>I<3FFC000000007FFE00000000FFFE00000000FFFE000000007FFE00 -0000003FFE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE00 -00000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE01 -FE000000FE0FFF800000FE3FFFE00000FEFFFFF00000FFFFFFF80000FFFFFFF80000FFFE -07FC0000FFF803FC0000FFE001FE0000FFC001FE0000FF8000FE0000FF8000FE0000FF00 -00FE0000FF0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE003FFFF81FFFF87FFFFC3FFFFCFFFFFE -3FFFFEFFFFFE3FFFFE7FFFFC3FFFFC3FFFF81FFFF82F3880B730>I<0000E000000003F8 -00000003F800000007FC00000007FC00000007FC00000003F800000003F800000000E000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000001FFFF800003FFFFC00007FFFFC00007FFFFC00003FFFFC00001F -FFFC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001 -FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC -00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00 -000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00003FFFFFFFC0 -7FFFFFFFE0FFFFFFFFE0FFFFFFFFE07FFFFFFFE03FFFFFFFC023397AB830>I<000001C0 -000007F0000007F000000FF800000FF800000FF8000007F0000007F0000001C000000000 -000000000000000000000000000000000000000000000000000000000000000000FFFFF0 -01FFFFF801FFFFF801FFFFF801FFFFF800FFFFF8000003F8000003F8000003F8000003F8 -000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8 -000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8 -000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8 -000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8 -000003F8000007F0000007F03C0007F07E000FE0FF001FE0FF003FC0FF007FC0FFFFFF80 -7FFFFF007FFFFE003FFFFC000FFFF00003FFC0001D4E7CB830>I<7FF800000000FFFC00 -000000FFFC00000000FFFC00000000FFFC000000007FFC0000000000FC0000000000FC00 -00000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC00 -00000000FC0000000000FC0000000000FC0000000000FC03FFFF8000FC07FFFFC000FC07 -FFFFE000FC07FFFFE000FC07FFFFC000FC03FFFF8000FC001FE00000FC003FC00000FC00 -7F800000FC00FF000000FC01FE000000FC03FC000000FC0FF8000000FC1FF0000000FC3F -E0000000FC7FC0000000FCFF80000000FDFFC0000000FFFFE0000000FFFFF0000000FFF7 -F0000000FFE3F8000000FFC1FC000000FF81FE000000FF00FF000000FE007F000000FC00 -3F800000FC001FC00000FC001FE00000FC000FF00000FC0007F00000FC0003F80000FC00 -01FC007FFFF81FFFE0FFFFFC3FFFF0FFFFFC3FFFF8FFFFFC3FFFF8FFFFFC3FFFF07FFFF8 -1FFFE02D387FB730>I<7FFFF80000FFFFFC0000FFFFFC0000FFFFFC0000FFFFFC00007F -FFFC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001 -FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC -00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00 -000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC0000 -0001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC000000 -01FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001 -FC00000001FC00007FFFFFFFF0FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF87FFFFF -FFF025387BB730>I<0000FC007E00007FC3FF01FF8000FFEFFF87FFC000FFFFFFCFFFE0 -00FFFFFFDFFFE000FFFFFFFFFFF0007FFF0FFF87F00007FE07FF03F80007FC07FE03F800 -07F803FC01F80007F803FC01F80007F003F801F80007F003F801F80007F003F801F80007 -E003F001F80007E003F001F80007E003F001F80007E003F001F80007E003F001F80007E0 -03F001F80007E003F001F80007E003F001F80007E003F001F80007E003F001F80007E003 -F001F80007E003F001F80007E003F001F80007E003F001F80007E003F001F80007E003F0 -01F80007E003F001F80007E003F001F80007E003F001F80007E003F001F8007FFE0FFF07 -FF80FFFF1FFF8FFFC0FFFF1FFF8FFFC0FFFF1FFF8FFFC0FFFF1FFF8FFFC07FFE0FFF07FF -80322881A730>I<000001FE00003FFC0FFF80007FFE3FFFE000FFFEFFFFF000FFFFFFFF -F8007FFFFFFFF8003FFFFE07FC0000FFF803FC0000FFE001FE0000FFC001FE0000FF8000 -FE0000FF8000FE0000FF0000FE0000FF0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE003FFFF81F -FFF87FFFFC3FFFFCFFFFFE3FFFFEFFFFFE3FFFFE7FFFFC3FFFFC3FFFF81FFFF82F2880A7 -30>I<0001FF0000000FFFE000003FFFF800007FFFFC0000FFFFFE0003FFFFFF8003FF01 -FF8007FC007FC00FF8003FE01FE0000FF01FE0000FF03FC00007F83F800003F87F800003 -FC7F000001FC7F000001FC7F000001FCFE000000FEFE000000FEFE000000FEFE000000FE -FE000000FEFE000000FEFE000000FEFE000000FEFF000001FE7F000001FC7F000001FC7F -800003FC3F800003F83FC00007F83FE0000FF81FF0001FF00FF8003FE00FFC007FE007FF -01FFC003FFFFFF8001FFFFFF00007FFFFC00003FFFF800000FFFE0000001FF0000272A7C -A830>I<000003FE00003FFC1FFF80007FFE7FFFE000FFFEFFFFF000FFFFFFFFFC007FFF -FFFFFE003FFFFE07FE0000FFF001FF0000FFE000FF8000FFC0007F8000FF80003FC000FF -00001FC000FE00001FE000FE00000FE000FE00000FE000FE00000FF000FE000007F000FE -000007F000FE000007F000FE000007F000FE000007F000FE000007F000FE000007F000FE -000007F000FE00000FF000FE00000FF000FE00000FE000FF00000FE000FF00001FE000FF -80003FC000FF80003FC000FFC0007F8000FFE000FF8000FFF003FF0000FFFC0FFE0000FF -FFFFFC0000FFFFFFF80000FEFFFFF00000FE7FFFC00000FE1FFF000000FE03FC000000FE -0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE -0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE -000000003FFFF80000007FFFFC000000FFFFFE000000FFFFFE0000007FFFFC0000003FFF -F80000002C3C80A730>I<0001FF00F800000FFFC1FC00003FFFF1FC00007FFFFDFC0001 -FFFFFFFC0003FFFFFFFC0007FF81FFFC000FFC007FFC000FF8001FFC001FF0000FFC001F -E00007FC003FC00007FC003F800003FC007F800003FC007F000003FC007F000001FC00FF -000001FC00FE000001FC00FE000001FC00FE000001FC00FE000001FC00FE000001FC00FE -000001FC00FE000001FC00FF000001FC007F000001FC007F000003FC007F800003FC007F -800003FC003FC00007FC003FC0000FFC001FE0001FFC000FF0003FFC000FFC007FFC0007 -FF01FFFC0003FFFFFFFC0001FFFFFDFC0000FFFFF9FC00003FFFF1FC00000FFFC1FC0000 -03FE01FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000 -000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000 -000001FC0000000001FC00000000FFFFF8000001FFFFFC000001FFFFFC000001FFFFFC00 -0001FFFFFC000000FFFFF82E3C7DA730>I<00000007F8003FFF803FFF007FFFC0FFFF80 -FFFFC3FFFF80FFFFCFFFFFC07FFFDFFFFFC03FFFFFFC3FC0001FFFE03FC0001FFF801F80 -001FFF000F00001FFE000000001FFC000000001FF8000000001FF0000000001FF0000000 -001FE0000000001FE0000000001FE0000000001FE0000000001FC0000000001FC0000000 -001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000 -001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000 -001FC00000003FFFFFFC00007FFFFFFE0000FFFFFFFF0000FFFFFFFF00007FFFFFFE0000 -3FFFFFFC00002A287EA730>I<001FFC1E0001FFFF9F0007FFFFFF000FFFFFFF001FFFFF -FF003FFFFFFF007FF007FF007F8001FF00FE0000FF00FC00007F00FC00007F00FC00007F -00FC00007F00FE00003E007F000000007FE00000003FFF0000001FFFFC00000FFFFF8000 -07FFFFE00001FFFFF800007FFFFC000003FFFE0000000FFF00000000FF807C00007F80FE -00001FC0FE00001FC0FE00000FC0FF00000FC0FF00000FC0FF80000FC0FF80001FC0FFC0 -003F80FFE0007F80FFFC03FF00FFFFFFFF00FFFFFFFE00FFFFFFFC00FCFFFFF000F83FFF -C000780FFE0000222A79A830>I<0007800000000FC00000001FC00000001FC00000001F -C00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC000003FFFFF -FFE07FFFFFFFF0FFFFFFFFF0FFFFFFFFF0FFFFFFFFF07FFFFFFFE0001FC00000001FC000 -00001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000 -001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC0000000 -1FC00000001FC00000001FC000F8001FC001FC001FC001FC001FC001FC001FC001FC001F -C001FC001FE003FC000FE007F8000FF007F8000FFC1FF00007FFFFE00003FFFFC00003FF -FF800001FFFF0000007FFC0000001FF00026337EB130>I<3FFC003FFC007FFE007FFE00 -FFFE00FFFE00FFFE00FFFE007FFE007FFE003FFE003FFE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0001FE0000FE0001FE0000FE0003FE0000FE0007FE00 -00FF000FFE00007FC07FFFF8007FFFFFFFFC003FFFFFFFFE001FFFFFFFFE000FFFFEFFFC -0007FFF87FF80000FFC000002F2880A630>I<3FFFC07FFF807FFFE0FFFFC0FFFFE0FFFF -E0FFFFE0FFFFE07FFFE0FFFFC03FFFC07FFF8001F80003F00001F80003F00001FC0007F0 -0000FC0007E00000FC0007E00000FE000FE000007E000FC000007E000FC000007F001FC0 -00003F001F8000003F001F8000003F803F8000001F803F0000001F803F0000001FC07F00 -00000FC07E0000000FC07E0000000FE0FE00000007E0FC00000007E0FC00000007F1FC00 -000003F1F800000003F1F800000003F1F800000001FBF000000001FBF000000001FBF000 -000001FFF000000000FFE000000000FFE000000000FFE0000000007FC0000000003F8000 -002B277EA630>I<3FFFC01FFFE07FFFE03FFFF0FFFFE03FFFF8FFFFE03FFFF87FFFE03F -FFF03FFFC01FFFE007E000003F0007E000003F0007F000007F0003F000007E0003F00000 -7E0003F000007E0003F000007E0003F000007E0003F80000FE0001F80000FC0001F80F80 -FC0001F81FC0FC0001F83FE0FC0001F83FE0FC0001F83FE0FC0000FC7FF1F80000FC7FF1 -F80000FC7DF1F80000FC7DF1F80000FCFDF9F800007CFDF9F000007CF8F9F000007CF8F9 -F000007CF8F9F000007EF8FBF000007EF8FBF000003FF07FE000003FF07FE000003FF07F -E000003FE03FE000003FE03FE000001FE03FC000000F800F80002D277FA630>I<3FFF81 -FFFC007FFFC3FFFE00FFFFC3FFFF00FFFFC3FFFF007FFFC3FFFE003FFF81FFFC0000FE00 -7F0000007F007F0000007F80FE0000003F81FC0000001FC3F80000000FE3F80000000FE7 -F000000007FFE000000003FFC000000001FFC000000000FF8000000000FF00000000007E -00000000007F0000000000FF0000000001FF8000000001FFC000000003F7E000000007E7 -E00000000FE3F00000000FC1F80000001F81FC0000003F80FE0000007F007E0000007E00 -7F000000FE003F800001FC001FC0007FFF80FFFF00FFFFC1FFFF80FFFFE3FFFF80FFFFE3 -FFFF80FFFFC1FFFF807FFF80FFFF0029277DA630>I<3FFFC07FFF807FFFE0FFFFC0FFFF -E0FFFFE0FFFFE0FFFFE07FFFE0FFFFC03FFFC07FFF8001FC0003F00001FC0003F00000FC -0007F00000FE0007E000007E0007E000007E000FE000007F000FC000003F000FC000003F -001FC000001F801F8000001F801F8000001FC01F8000000FC03F0000000FC03F0000000F -E03F00000007E07E00000007E07E00000003F07E00000003F07C00000003F0FC00000001 -F8FC00000001F8F800000001F8F800000000F9F800000000FDF0000000007DF000000000 -7FF0000000007FF0000000003FE0000000003FE0000000003FE0000000001FC000000000 -1FC0000000001FC0000000001F80000000001F80000000003F80000000003F0000000000 -3F00000000007F00000000007E00000000007E0000000F00FE0000001F80FC0000003FC1 -FC0000003FC3F80000003F87F80000003F8FF00000003FFFE00000001FFFC00000001FFF -800000000FFF0000000007FE0000000001F0000000002B3C7EA630>I<1FFFFFFFFC3FFF -FFFFFE7FFFFFFFFE7FFFFFFFFE7FFFFFFFFE7FFFFFFFFC7F00000FF87F00001FF07F0000 -3FE07F00007FC07F0000FF803E0001FF00000003FE00000007FC0000000FF80000001FF0 -0000003FE00000007FC0000000FF80000001FF00000003FE00000007FC0000000FF80000 -001FF00000003FE00000007FC0000000FF80003E01FF00007F03FE00007F07FC00007F0F -F800007F1FF000007F3FE000007F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFF7FFFFFFFFE28277DA630>I<0000003FF0000003FFF800000FFFF800001FFFF800 -007FFFF800007FFFF00000FFF0000000FF00000001FE00000001FC00000001FC00000001 -FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC -00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00 -000001FC00000001FC00000001FC00000003FC00000007F80000003FF800003FFFF00000 -FFFFE00000FFFFC00000FFFF000000FFFFC00000FFFFE000003FFFF00000003FF8000000 -07F800000003FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001 -FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC -00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00 -000001FE00000000FF00000000FFF00000007FFFF000007FFFF800001FFFF800000FFFF8 -000003FFF80000003FF025477BBE30>I<7C7CFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE -FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE -FEFEFEFEFEFEFEFEFEFEFEFEFEFE7C7C07476CBE30>I<7FE0000000FFFE000000FFFF80 -0000FFFFC00000FFFFF000007FFFF00000007FF800000007F800000003FC00000001FC00 -000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC0000 -0001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC000000 -01FC00000001FC00000001FC00000001FC00000001FC00000001FE00000000FF00000000 -FFE00000007FFFE000003FFFF800001FFFF8000007FFF800001FFFF800003FFFF800007F -FFE00000FFE0000000FF00000001FE00000001FC00000001FC00000001FC00000001FC00 -000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC0000 -0001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC000000 -01FC00000001FC00000003FC00000007F80000007FF800007FFFF00000FFFFF00000FFFF -C00000FFFF800000FFFE0000007FE000000025477BBE30>I<007C003801FF007C03FF80 -FE07FFC1FE0FFFC3FE1FFFEFFC7FEFFFF0FF87FFE0FF07FFC0FE03FF807C01FF0038007C -001F0C78B730>I E /Fo 39 122 df<0000000007FF80000000003FFFE000000000FE00 -F800000001F0003E00000007E0000E0000000FC0001F0000000F80007F0000001F8000FF -0000003F0000FF0000003F0000FF0000003F0000FE0000007E0000FE0000007E00007800 -00007E000000000000FE000000000000FC000000000000FC000000000000FC0000000000 -01FC000000000001FC000000000001F8000000000001F8000000000001F8000000000001 -F8000000000003F80000000003FFFFFFFFF00003FFFFFFFFF00003FFFFFFFFE0000003F0 -0007E0000007F0000FE0000007E0000FC0000007E0000FC0000007E0000FC0000007E000 -1FC000000FE0001F8000000FC0001F8000000FC0001F8000000FC0003F8000000FC0003F -0000001FC0003F0000001F80003F0000001F80007F0000001F80007E0000001F80007E00 -00003F80007E0000003F0000FE0000003F0000FC0000003F0000FC0000003F0000FC0000 -007F0001FC0000007E0001F81C00007E0001F81C00007E0001F81C00007E0003F81C0000 -FE0003F03C0000FC0003F0380000FC0003F0380000FC0003F0780000FC0003F0700001FC -0003F0700001F80001F0F00001F80001F0E00001F80000F1C00001F800007F800003F000 -001F000003F0000000000003F0000000000003F0000000000003E0000000000007E00000 -00000007E0000000001E07C0000000007F07C0000000007F0FC000000000FF0F80000000 -00FF0F8000000000FF1F0000000000FE1F0000000000F81E0000000000703C0000000000 -787800000000001FF0000000000007C00000000000385383BF33>12 -D<0000000007FC00007FF800000000003FFF8003FFFF0000000000FC03C00FE007C00000 -0003F001E03F0001F000000007E001F07C0000700000000FC007F0F80000F80000000F80 -0FF1F80003F80000001F800FF3F00007F80000001F800FF3F00007F80000003F000FF7E0 -0007F80000003F000FE7E00007F00000003F00038FC00007F00000007E00000FC00003C0 -0000007E00000FC00000000000007E00000FC00000000000007E00001FC0000000000000 -FE00001F80000000000000FC00001F80000000000000FC00001F80000000000000FC0000 -3F80000000000000FC00003F80000000000001FC00003F00000000000001F800003F0000 -0000000001F800003F00000000000001F800003F000000000001FFFFFFFFFFFFFFFF8000 -03FFFFFFFFFFFFFFFF800003FFFFFFFFFFFFFFFF00000003F000007E00003F00000003F0 -00007E00007F00000003F00000FE00007E00000007F00000FC00007E00000007E00000FC -00007E00000007E00000FC0000FE00000007E00000FC0000FC00000007E00001FC0000FC -0000000FE00001F80000FC0000000FC00001F80001FC0000000FC00001F80001F8000000 -0FC00001F80001F80000000FC00003F80001F80000001FC00003F00003F80000001F8000 -03F00003F00000001F800003F00003F00000001F800003F00003F00000001F800007F000 -07F00000003F800007E00007E00000003F800007E00007E00000003F000007E00007E000 -00003F000007E0000FE00000003F00000FE0000FC0E000003F00000FC0000FC0E000007F -00000FC0000FC0E000007E00000FC0001FC0E000007E00000FC0001F81E000007E00000F -C0001F81C000007E00001FC0001F81C00000FE00001F80001F83C00000FC00001F80001F -83800000FC00001F80001F83800000FC00003F80000F87800000FC00003F00000F870000 -01F800003F0000078E000001F800003F000003FC000001F800003F000000F8000001F800 -007E00000000000003F000007E00000000000003F000007E00000000000003F000007C00 -000000000003F00000FC00000000000003E00000FC00000000001E07E07800F800000000 -007F07E1FC01F800000000007F07C1FC01F80000000000FF0FC3FC01F00000000000FF0F -83FC03E00000000000FF0F83FC07E00000000000FE1F03F807C00000000000F81E03E00F -800000000000703C01C01E000000000000787800F07C0000000000001FF0007FF0000000 -00000007C0001FC0000000000000555383BF50>14 D<00003C0000FE0001FF0003FF0003 -FF0003FF0003FF0003FE0007FE0007FE0007FC0007FC0007FC0007F8000FF8000FF8000F -F0000FF0000FF0000FE0001FE0001FE0001FC0001FC0001FC0001F80003F80003F80003F -00003F00003F00003E00007E00007E00007C00007C00007C0000780000F80000F80000F0 -0000F00000F00000E00001E00001E00000C0000000000000000000000000000000000000 -000000000000000F00003FC0007FC0007FC000FFC000FFC000FFC000FF80007F00003C00 -00184177C01C>33 D<01E000F007F803FC0FF807FC0FFC07FE1FFC0FFE1FFC0FFE1FFC0F -FE1FFC0FFE0FFC07FE03D801EC0018000C0018000C0038001C0030001800700038006000 -3000E0007000C0006001C000E0038001C003000180070003800E0007001C000E0038001C -0070003800E0007000C00060001F1C70BE2F>I<0F003FC07FC07FC0FFC0FFC0FFC0FF80 -7F003C000A0A77891C>46 D<00000003000000070000000F0000001F0000001E0000003E -0000007E000001FE000003FC000007FC00001FFC0001FFFC000FFBF8001FC3F8000E07F8 -000007F8000007F0000007F000000FF000000FF000000FE000000FE000001FE000001FE0 -00001FC000001FC000003FC000003FC000003F8000003F8000007F8000007F8000007F00 -00007F000000FF000000FF000000FE000000FE000001FE000001FE000001FC000001FC00 -0003FC000003FC000003F8000003F8000007F8000007F8000007F0000007F000000FF000 -000FF000000FE000000FE000001FE000001FE000001FC000007FE000FFFFFFF0FFFFFFF0 -FFFFFFE0203D77BC2E>49 D<0000000FE00000007FF8000001F01C000007C00E00001F80 -0F00003E000700007C001F0000F8007F0001F000FF0003F000FF0007E000FF000FC000FE -001FC000FE003F800078003F000000007F00000000FE00000000FE00000001FC00000001 -FC00000003FC00000003F800000007F81FC00007F87FF0000FF1E07C000FF3803E000FF7 -003E001FFE001F001FFC001F801FF8001F801FF0000FC03FF0000FC03FE0000FC03FE000 -1FC03FC0001FE07FC0001FE07FC0001FE07F80001FE07F80003FC07F80003FC0FF00003F -C0FF00003FC0FF00007FC0FF00007F80FE00007F80FE00007F80FE0000FF80FE0000FF00 -FE0000FF00FE0001FE00FE0001FE00FC0001FC007C0003F8007C0003F8007E0007F0007E -000FE0003E001FC0003F003F80001F807E00000FC1FC000007FFF8000003FFE00000007F -000000283F76BC2E>54 D<0000007F00000001FFE0000007C0F000001F007C00003C003C -000078003E0000F0001F0001F0001F0003E0001F0003C0001F0007C0001F0007C0001F00 -0F80001F000F80001F000F80003F001F80003E001F80003E001F80007E001FC0007C001F -C000F8001FE001F8001FF001F0001FF803E0001FFC07C0000FFE0F00000FFFBE000007FF -F8000003FFF0000001FFF0000000FFF8000000FFFC000003FFFE00000F9FFF00001F0FFF -80007C07FFC000F803FFC001F001FFE003E0007FE007C0003FE00F80001FE01F80000FE0 -1F00000FE03E000007E03E000007E07E000007E07C000007E07C000007E0FC000007C0F8 -000007C0F8000007C0F800000F80F800000F80F800001F00F800003E007C00003C007C00 -007C007E0000F8003F0003F0001F8007C0000FE03F800007FFFE000001FFF80000003FC0 -0000283F78BC2E>56 D<001E00003F80007F8000FFC001FFC001FFC001FF8000FF0000FE -00003C000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000F00003FC0007FC0007FC0 -00FFC000FFC000FFC000FF80007F00003C0000122777A61C>58 D<00000000FF8001C000 -00000FFFE001C00000003FFFF80380000000FF807E0780000003FC001F0F8000000FF000 -071F8000001FC00007BF0000007F800003FF000000FF000001FF000001FE000001FF0000 -03F8000000FE000007F0000000FE00000FF0000000FE00001FE00000007E00003FC00000 -007C00007F800000007C0000FF800000007C0000FF000000007C0001FE00000000780003 -FE00000000780003FC00000000780007FC00000000780007F80000000070000FF8000000 -0070000FF80000000070001FF00000000070001FF00000000000003FE00000000000003F -E00000000000003FE00000000000007FE00000000000007FC00000000000007FC0000000 -0000007FC0000000000000FFC0000000000000FF80000000000000FF80000000000000FF -80000000000000FF80000000000000FF00000000000000FF00000000000000FF00000000 -0F0000FF000000000F0000FF000000000E0000FF000000000E0000FF000000001E0000FF -000000001C0000FF000000003C0000FF00000000380000FF000000007800007F00000000 -7000007F80000000F000007F80000001E000003F80000001C000003FC0000003C000001F -C00000078000001FE000000F0000000FE000001E00000007F000003C00000003F80000F8 -00000001FC0001F000000000FE0007C0000000007FC03F80000000001FFFFE0000000000 -07FFF0000000000000FF80000000003A4272BF41>67 D<0001FFFFFFFFFFF00001FFFFFF -FFFFF00001FFFFFFFFFFF0000003FE00003FF0000003FE00000FF0000003FC000003F000 -0003FC000003F0000003FC000001E0000007FC000001E0000007F8000001E0000007F800 -0001E0000007F8000001E000000FF8000001E000000FF0000001E000000FF0000001C000 -000FF0000001C000001FF0000001C000001FE0000001C000001FE0007001C000001FE000 -F003C000003FE000E0038000003FC000E0000000003FC000E0000000003FC001E0000000 -007FC001C0000000007F8003C0000000007F8003C0000000007F8007C000000000FF801F -8000000000FFFFFF8000000000FFFFFF8000000000FFFFFF8000000001FF003F00000000 -01FE001F0000000001FE000F0000000001FE000F0000000003FE000E0000000003FC000E -0000000003FC000E0000000003FC001E0000000007FC001C0000000007F8001C00000000 -07F8001C0000000007F80000000000000FF80000000000000FF00000000000000FF00000 -000000000FF00000000000001FF00000000000001FE00000000000001FE0000000000000 -1FE00000000000003FE00000000000003FC00000000000003FC00000000000007FC00000 -000000007FC00000000000007F80000000000000FFC00000000000FFFFFFE000000000FF -FFFFE000000000FFFFFFE0000000003C3E7BBD3B>70 D<0001FFFE00000FFFFF0003FFFF -00001FFFFF0003FFFF00001FFFFF000001FF800000FFC0000003FF8000003F00000003FF -8000003E00000003FFC000001C00000003FFC000003C00000007BFC000003C000000073F -E0000038000000071FE0000038000000071FE00000780000000F1FF00000780000000E0F -F00000700000000E0FF80000700000000E0FF80000F00000001E07F80000F00000001C07 -FC0000E00000001C07FC0000E00000001C03FC0001E00000003C03FE0001E00000003801 -FE0001C00000003801FE0001C00000003801FF0003C00000007800FF0003C00000007000 -FF8003800000007000FF80038000000070007F800780000000F0007FC00780000000E000 -3FC00700000000E0003FC00700000000E0003FE00F00000001E0001FE00F00000001C000 -1FF00E00000001C0001FF00E00000001C0000FF01E00000003C0000FF81E000000038000 -0FF81C00000003800007F81C00000003800007FC3C00000007800003FC3C000000070000 -03FC3800000007000003FE3800000007000001FE780000000F000001FF780000000E0000 -01FF700000000E000000FF700000000E000000FFF00000001E000000FFF00000001C0000 -007FE00000001C0000007FE00000001C0000003FE00000003C0000003FE0000000380000 -003FC0000000380000001FC0000000780000001FC0000000F80000001FC0000001FC0000 -000F80000007FE0000000F800000FFFFF0000007800000FFFFF0000007800000FFFFF000 -0007000000483E7BBD44>78 D<0001FFFFFFFF80000001FFFFFFFFF0000001FFFFFFFFFC -00000003FE0003FE00000003FE0000FF00000003FC00007F80000003FC00003FC0000007 -FC00001FC0000007FC00001FE0000007F800001FE0000007F800001FE000000FF800001F -F000000FF800001FF000000FF000001FF000000FF000001FF000001FF000001FF000001F -F000003FE000001FE000003FE000001FE000003FE000003FE000003FC000003FE000007F -C000003FC000007F8000003FC000007F8000007FC00000FF0000007FC00000FE0000007F -800001FC0000007F800003F8000000FF800007F0000000FF80000FE0000000FF00003FC0 -000000FF0001FF00000001FFFFFFFC00000001FFFFFFE000000001FE00000000000001FE -00000000000003FE00000000000003FE00000000000003FC00000000000003FC00000000 -000007FC00000000000007FC00000000000007F800000000000007F80000000000000FF8 -0000000000000FF80000000000000FF00000000000000FF00000000000001FF000000000 -00001FF00000000000001FE00000000000001FE00000000000003FE00000000000003FE0 -0000000000003FC00000000000003FC00000000000007FC00000000000007FC000000000 -00007F80000000000000FFC00000000000FFFFFF8000000000FFFFFF8000000000FFFFFF -80000000003C3E7BBD3E>80 D<0000000FF001C00000007FFE01C0000001FFFF03800000 -07F80FC78000000FC003EF8000001F8001FF8000003F0000FF0000007E00007F000000FC -00007F000001F800007F000003F000003E000003F000003E000007E000003E000007E000 -003E00000FE000003C00000FC000003C00000FC000003C00000FC000003C00001FC00000 -3800001FC000003800001FC000003800001FE000003800001FE000000000001FF0000000 -00001FF000000000001FFC00000000000FFF00000000000FFFF0000000000FFFFE000000 -0007FFFFC000000003FFFFF000000001FFFFFC00000000FFFFFE000000003FFFFE000000 -000FFFFF0000000001FFFF80000000001FFF800000000003FF800000000000FFC0000000 -00007FC000000000003FC000000000003FC000000000001FC000000000001FC000070000 -001FC0000F0000001FC0000F0000001F80000E0000001F80000E0000001F80001E000000 -3F80001E0000003F00001E0000003F00001E0000003E00003E0000007E00003E0000007C -00003F000000FC00003F000001F800007F800001F000007F800003E000007FC00007C000 -007DE0001F800000F8F8003F000000F87F00FE000000F03FFFF8000000E00FFFE0000000 -C000FF0000000032427ABF33>83 D<000C0006001C000E0078003C00E0007001C000E001 -8000C0038001C0070003800E0007000C0006001C000E0018000C0038001C003000180070 -0038006000300060003000E0007000CF006780FFC07FE0FFC07FE0FFC07FE0FFC07FE0FF -C07FE0FFC07FE0FF807FC07F003F803C001E001F1C69BE2F>92 D<00007E00000001FF80 -000007C1C380001F80EFC0003F00FFC0007E007FC000FC007F8001F8003F8003F0003F80 -03F0003F8007E0003F000FE0003F000FC0003F001FC0007F001FC0007E003F80007E003F -80007E003F8000FE007F8000FC007F0000FC007F0000FC007F0001FC00FF0001F800FE00 -01F800FE0001F800FE0003F800FE0003F038FC0003F038FC0003F038FC0007F038FC0007 -E078FC000FE0707C000FE0707C001FE0F07E003FE0E03E007FE0E03E00F3E1E01F01E3E1 -C00F8781E38003FF00FF0000FC003E00252977A72E>97 D<001FC0000FFFC0000FFF8000 -0FFF8000003F8000003F8000003F0000003F0000007F0000007F0000007E0000007E0000 -00FE000000FE000000FC000000FC000001FC000001FC000001F8000001F8000003F80000 -03F8000003F0000003F07E0007F1FF8007F783E007EF01F007FE01F00FF800F80FF800F8 -0FF000FC0FE0007C1FC0007C1FC0007E1F80007E1F8000FE3F8000FE3F8000FE3F0000FE -3F0000FE7F0001FE7F0001FC7E0001FC7E0001FC7E0003FCFE0003F8FC0003F8FC0003F8 -FC0007F0FC0007F0FC0007E0F8000FE0F8000FC0F8001FC0F8001F8078003F007C003F00 -7C007E003C00FC003E01F8001E03E0000F07C00007FF000001F800001F4076BE2A>I<00 -001FE0000000FFF8000003F03E000007C00F00001F800700003F000780007E001F8000FC -007F8001F8007F8003F0007F8007F0007F0007E0007F000FE0007E001FC00000001FC000 -00003F800000003F800000003F800000007F800000007F000000007F000000007F000000 -00FF00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000 -FC000003007E000007007E00000F007E00001E003E00003C003E000078001F0000F0001F -0003E0000F800F800003E07E000001FFF80000003FC00000212977A72A>I<000000003F -800000001FFF800000001FFF000000001FFF00000000007F00000000007F00000000007E -00000000007E0000000000FE0000000000FE0000000000FC0000000000FC0000000001FC -0000000001FC0000000001F80000000001F80000000003F80000000003F80000000003F0 -0000000003F00000000007F00000000007F00000000007E00000007E07E0000001FF8FE0 -000007C1CFE000001F80EFC000003F00FFC000007E007FC00000FC007FC00001F8003F80 -0003F0003F800003F0003F800007E0003F80000FE0003F00000FC0003F00001FC0007F00 -001FC0007F00003F80007E00003F80007E00003F8000FE00007F8000FE00007F0000FC00 -007F0000FC00007F0001FC0000FF0001FC0000FE0001F80000FE0001F80000FE0003F800 -00FE0003F83800FC0003F03800FC0003F03800FC0007F03800FC0007F07800FC000FE070 -007C000FE070007C001FE0F0007E003FE0E0003E007FE0E0003E00F3E1E0001F01E3E1C0 -000F8781E3800003FF00FF000000FC003E0000294077BE2E>I<00003F800001FFE00007 -E0F8001F803C003E003C00FC001E01F8001E03F0001E07F0001E0FE0003E0FC0003C1FC0 -003C3F80007C3F8000F83F8003F07F000FE07F00FF80FFFFFC00FFFFC000FE000000FE00 -0000FE000000FE000000FC000000FC000000FC000000FC000000FC000000FC000000FC00 -0006FC00000EFC00001E7C00003C7C0000783E0000F03E0001E01F0007C00F801F0007C0 -FC0001FFF000007F80001F2976A72A>I<000000007C0000000001FF0000000007C78000 -00000F83C00000001F87C00000001F1FC00000003F3FC00000003F3FC00000007E3FC000 -00007E3FC00000007E3F800000007E0E00000000FC0000000000FC0000000000FC000000 -0000FC0000000001FC0000000001F80000000001F80000000001F80000000001F8000000 -0003F80000000003F00000000003F00000000003F000000003FFFFF8000003FFFFF80000 -03FFFFF800000007E00000000007E00000000007E0000000000FE0000000000FC0000000 -000FC0000000000FC0000000000FC0000000000FC0000000001FC0000000001F80000000 -001F80000000001F80000000001F80000000003F80000000003F00000000003F00000000 -003F00000000003F00000000007F00000000007E00000000007E00000000007E00000000 -007E0000000000FE0000000000FC0000000000FC0000000000FC0000000000FC00000000 -01FC0000000001F80000000001F80000000001F80000000001F80000000003F000000000 -03F00000000003F00000000003F00000000007E00000000007E00000000007E000000000 -07E0000000000FC00000001E0FC00000007F0FC00000007F0F80000000FF0F80000000FF -1F00000000FF1F00000000FE1E00000000F83C00000000703C000000007878000000003F -E0000000000F80000000002A5383BF1C>I<000003F00000000FFC0000003E0E1C0000FC -077E0001F003FE0003F003FE0007E001FE000FC001FC001F8001FC001F8001FC003F0001 -FC007F0001F8007E0001F800FE0003F800FE0003F801FC0003F001FC0003F001FC0007F0 -03FC0007F003F80007E003F80007E003F8000FE007F8000FE007F0000FC007F0000FC007 -F0001FC007F0001FC007F0001F8007E0001F8007E0003F8003E0003F8003E0007F0003F0 -00FF0003F000FF0001F001FF0000F003FE0000F80F7E00007C1EFE00001FF8FE000007E0 -FC00000000FC00000001FC00000001FC00000001F800000001F800000003F800000003F8 -00000003F0001C0007F0007F0007E000FF000FE000FF000FC000FF001F8000FF003F0000 -FE007E0000F800FC00007C03F000001FFFC0000003FE000000273B7CA72A>I<0001FC00 -0000FFFC000000FFF8000000FFF800000003F800000003F800000003F000000003F00000 -0007F000000007F000000007E000000007E00000000FE00000000FE00000000FC0000000 -0FC00000001FC00000001FC00000001F800000001F800000003F800000003F800000003F -000000003F03F800007F0FFE00007F3E0F80007E780FC0007EE007C000FFC007E000FF80 -07E000FF0007E000FF0007E001FE0007E001FC0007E001FC0007E001F80007E003F8000F -E003F8000FC003F0000FC003F0000FC007F0001FC007F0001F8007E0001F8007E0001F80 -0FE0003F800FE0003F000FC0003F000FC0007F001FC0007E001FC000FE071F8000FC071F -8000FC073F8001FC0F3F8001F80E3F0001F80E3F0001F81E7F0001F01C7F0001F01C7E00 -01F0387E0001F038FE0001F070FE0000F0E0FC00007FC03800001F0028407ABE2E>I<00 -00780001FC0001FC0003FC0003FC0003FC0003F80000E000000000000000000000000000 -0000000000000000000000000000000000000000000000000000007C0001FF00038F8007 -07800E07C01E07C01C07C03C0FC0380FC0380FC0781FC0701F80701F80F03F80F03F0000 -3F00007F00007E0000FE0000FC0000FC0001FC0001F80001F80003F80003F00003F03807 -F03807E0380FE0780FC0700FC0700FC0F00F80E00F80E00F81C00F83C00F838007870003 -FE0000F800163E79BC1C>I<00000007000000001FC00000001FC00000003FC00000003F -C00000003FC00000003F800000000E000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000007C00000003FF000000078F8000000E07C000001C07C000003 -C07C000003807E000007007E000007007E00000E00FE00000E00FC00001E00FC00001C00 -FC00003C01FC00003C01FC00000001F800000001F800000003F800000003F800000003F0 -00000003F000000007F000000007F000000007E000000007E00000000FE00000000FE000 -00000FC00000000FC00000001FC00000001FC00000001F800000001F800000003F800000 -003F800000003F000000003F000000007F000000007F000000007E000000007E00000000 -FE00000000FE00000000FC00000000FC00000001FC00000001F800000001F800001C01F8 -00007F03F00000FF03F00000FF07E00000FF07C00000FF0F800000FE1F000000F83E0000 -00707C0000003FF00000000FC0000000225083BC1C>I<0001FC000000FFFC000000FFF8 -000000FFF800000003F800000003F800000003F000000003F000000007F000000007F000 -000007E000000007E00000000FE00000000FE00000000FC00000000FC00000001FC00000 -001FC00000001F800000001F800000003F800000003F800000003F000000003F0003E000 -7F000FF8007F003C3C007E00707C007E00E1FC00FE01C1FC00FE0383FC00FC0703FC00FC -0E03FC01FC1C03F801FC3800E001F870000001F860000003F8E0000003F9C0000003F780 -000003FE00000007FE00000007FFE0000007E7F8000007E0FE00000FE07F00000FE03F80 -000FC01F80000FC00FC0001FC00FC0001FC00FC0701F800FC0701F800FC0703F800FC0F0 -3F801FC0E03F001F80E03F001F80E07F001F81E07F001F81C07E000F83C07E000F8380FE -000F8780FE00078F00FC0003FE00380000F80026407ABE2A>I<0007F003FFF003FFE003 -FFE0000FE0000FE0000FC0000FC0001FC0001FC0001F80001F80003F80003F80003F0000 -3F00007F00007F00007E00007E0000FE0000FE0000FC0000FC0001FC0001FC0001F80001 -F80003F80003F80003F00003F00007F00007F00007E00007E0000FE0000FE0000FC0000F -C0001FC0001FC0001F80001F80003F80003F80003F00003F00007F00007F07007E07007E -0700FE0F00FE0E00FC0E00FC0E00FC1E00FC1C00FC1C007C38007C78003C70001FE00007 -8000144079BE17>I<01F0003F80007F000007FC01FFE003FFC0000F3E07C1F80F83F000 -0E1F0F00FC1E01F8001E1F1C007C3800F8001C1F38007E7000FC003C1FF0007EE000FC00 -381FF0007FE000FC00381FE0007FC000FC00783FC0007F8000FC00703FC0007F8000FC00 -703F80007F0000FC00703F00007E0000FC00F03F0000FE0001FC00F07F0000FC0001F800 -007E0000FC0001F800007E0000FC0001F800007E0001FC0003F80000FE0001FC0003F000 -00FC0001F80003F00000FC0001F80003F00000FC0003F80007F00001FC0003F80007E000 -01F80003F00007E00001F80003F0000FE00001F80007F0000FC00003F80007F0001FC0E0 -03F00007E0001F80E003F00007E0001F80E003F0000FE0003F81E007F0000FE0003F01C0 -07E0000FC0003F01C007E0000FC0003F01C007E0001FC0003E03800FE0001FC0003E0380 -0FC0001F80003E07000FC0001F80003E07000FC0003F80003E0E001FC0003F80001E1C00 -1F80003F00000FF8000700000E000003E000432979A74A>I<01F0003F800007FC01FFE0 -000F3E07C1F8000E1F0F00FC001E1F1C007C001C1F38007E003C1FF0007E00381FF0007E -00381FE0007E00783FC0007E00703FC0007E00703F80007E00703F00007E00F03F0000FE -00F07F0000FC00007E0000FC00007E0000FC00007E0001FC0000FE0001F80000FC0001F8 -0000FC0001F80000FC0003F80001FC0003F00001F80003F00001F80007F00001F80007E0 -0003F8000FE07003F0000FC07003F0000FC07003F0001FC0F007F0001F80E007E0001F80 -E007E0001F81E007E0001F01C00FE0001F01C00FC0001F03800FC0001F03800FC0001F07 -001FC0000F0E001F800007FC0007000001F0002C2979A733>I<00001FC0000000FFF800 -0003F07C00000FC01F00001F801F00003F000F80007E000FC000FC0007C001F80007E003 -F00007E007F00007E007E00007E00FE00007F01FC00007F01FC00007F03F800007F03F80 -0007F03F80000FE07F80000FE07F00000FE07F00000FE07F00001FE0FF00001FC0FE0000 -1FC0FE00001FC0FE00003F80FE00003F80FE00007F00FE00007F00FC00007E007C0000FC -007E0001FC007E0001F8007E0003F0003E0007E0001F000FC0001F001F80000F803E0000 -07C0FC000001FFF00000003F800000242977A72E>I<0003E001F800000FF807FE00001E -7C1E0F80001C3E3C07C0003C3E7807C000383EE003E000783FE003E000703FC003F00070 -3F8001F000F07F0001F000E07F0001F800E07E0001F800E07E0003F801E0FE0003F801E0 -FE0003F80000FC0003F80000FC0003F80001FC0007F80001FC0007F00001F80007F00001 -F80007F00003F8000FF00003F8000FE00003F0000FE00003F0000FE00007F0001FC00007 -F0001FC00007E0001F800007E0003F80000FE0003F00000FE0007F00000FE0007E00000F -E000FC00001FE000FC00001FE001F800001FF003F000001FF007E000003FB80F8000003F -9C1F0000003F0FFC0000003F03E00000007F00000000007F00000000007E00000000007E -0000000000FE0000000000FE0000000000FC0000000000FC0000000001FC0000000001FC -0000000001F80000000001F80000000003F80000000003F8000000007FFFE0000000FFFF -E0000000FFFFE00000002D3A80A72E>I<01F000FC0007FC07FF800F3E0F03C00E1F1C03 -E01E1F380FE01C1F700FE03C1FE01FE0381FE01FE0381FC01FE0783FC01FC0703F800700 -703F800000703F000000F03F000000F07F000000007E000000007E000000007E00000000 -FE00000000FC00000000FC00000000FC00000001FC00000001F800000001F800000001F8 -00000003F800000003F000000003F000000003F000000007F000000007E000000007E000 -000007E00000000FE00000000FC00000000FC00000000FC00000001FC00000001F800000 -000700000000232979A726>114 D<00007F800001FFE00007C0F8001F003C003E001C00 -3C001E007C003E00F8007E00F800FE00F800FE01F800FC01F800FC01F8007001FC000001 -FE000001FFC00001FFFC0000FFFF0000FFFF80007FFFC0003FFFE0000FFFF00000FFF000 -000FF0000007F0000003F00C0003F03F0003F07F8001F07F8003F0FF0003E0FF0003E0FF -0003E0FC0007C0F0000F8070000F8078001F003C003C001F01F80007FFE00000FF00001F -297AA725>I<0001C0000003F0000007F0000007F0000007E0000007E000000FE000000F -E000000FC000000FC000001FC000001FC000001F8000001F8000003F8000003F8000003F -0000003F00007FFFFF80FFFFFF80FFFFFF00007E000000FE000000FE000000FC000000FC -000001FC000001FC000001F8000001F8000003F8000003F8000003F0000003F0000007F0 -000007F0000007E0000007E000000FE000000FE000000FC000000FC000001FC000001FC0 -1C001F801C001F801C003F803C003F8038003F0078003F0070003F00F0003F00E0003F01 -C0001F03C0001F0780000F0F000007FC000001F00000193A78B81E>I<007C0000000001 -FF00001C00038F80007E00070780007E000E07C0007E001E07C000FE001C07C000FE003C -0FC000FC00380FC000FC00380FC001FC00781FC001FC00701F8001F800701F8001F800F0 -3F8003F800F03F0003F800003F0003F000007F0003F000007E0007F000007E0007F00000 -FE0007E00000FC0007E00000FC000FE00001FC000FE00001F8000FC00001F8000FC00001 -F8001FC00003F8001FC1C003F0001F81C003F0001F81C003F0003F81C003F0003F83C003 -F0003F038003F0003F038003F0007F078001F000FF070001F001FF070001F801DF0F0000 -F8079F0E00007C0F0F1C00001FFC07F8000007F001F0002A2979A731>I<007C0001C001 -FF0007F0038F8007F007078007F00E07C007F81E07C007F81C07C003F83C0FC003F8380F -C001F0380FC001F0781FC000F0701F8000F0701F8000F0F03F8000F0F03F0000E0003F00 -00E0007F0000E0007E0001E0007E0001C000FE0001C000FC0001C000FC0003C001FC0003 -8001F800038001F800038001F800070003F800070003F0000F0003F0000E0003F0000E00 -03F0001C0003F0001C0003F000380003F000780001F000700001F800E00000F801C00000 -FC038000007E0F0000001FFE00000003F00000252979A72A>I<007C000000007001FF00 -007001FC038F8001F801FC07078001F801FC0E07C001F801FE1E07C003F801FE1C07C003 -F000FE3C0FC003F000FE380FC003F0007C380FC007F0007C781FC007E0003C701F8007E0 -003C701F8007E0003CF03F800FE0003CF03F000FC00038003F000FC00038007F000FC000 -38007E001FC00078007E001F80007000FE001F80007000FC001F80007000FC003F8000F0 -01FC003F0000E001F8003F0000E001F8003F0000E001F8003F0001E003F8007F0001C003 -F0007E0001C003F0007E0003C003F0007E00038003F0007E00038003F0007E00070003F0 -00FE00070003F000FE000E0001F001FE001E0001F801FF001C0000F8039F00380000FC07 -9F807000003E0F07C1E000001FFC03FFC0000003F0007F0000372979A73C>I<0003F001 -F800000FFC07FE00003C1E0E0F0000780F1C0F8000F00FB83F8001E00FF83F8001C007F0 -7F80038007F07F80078007E07F8007000FE07F000F000FE01C000E000FC000000E000FC0 -00001E001FC000001E001FC0000000001F80000000001F80000000003F80000000003F00 -000000003F00000000003F00000000007F00000000007E00000000007E00000000007E00 -00000000FE0000000000FC001C000000FC001C000000FC001C000001FC003C001E01FC00 -38003F01F80078007F81F80070007F83F800F000FF83F800E000FF077801C000FE0F7C03 -C0007C0E3C078000783C1E1E00001FF80FFC000007E003F0000029297CA72A>I<007C00 -000001FF000038038F8000FC07078000FC0E07C000FC1E07C001FC1C07C001F83C0FC001 -F8380FC001F8380FC003F8781FC003F0701F8003F0701F8003F0F03F8007F0F03F0007E0 -003F0007E0007F0007E0007E000FE0007E000FC000FE000FC000FC000FC000FC001FC001 -FC001FC001F8001F8001F8001F8001F8003F8003F8003F0003F0003F0003F0003F0003F0 -007F0003F0007E0003F0007E0003F0007E0003F000FE0003F000FC0001F001FC0001F803 -FC0000F807FC00007C1FF800003FF9F8000007E1F800000003F800000003F000000003F0 -00000007F0000E0007E0003F8007E0007F800FC0007F800FC0007F801F8000FF001F0000 -FF003E00007C007E00007000FC00007801F000003803E000001E0FC000000FFF00000003 -F8000000263B79A72C>I E /Fp 78 125 df<000001FF000FE00000001FFFE03FFC0000 -007F00F8FC1E000001FC003FF03F000007F0007FE07F80000FE000FFE0FF80001FC001FF -C0FF80003F8001FF80FF80007F8001FF80FF80007F0001FF807F00007F0001FF003E0000 -FE0000FF00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F -00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000 -FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F -000000FFFFFFFFFFFF8000FFFFFFFFFFFF8000FFFFFFFFFFFF800000FE00007F00000000 -FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F -00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000 -FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F -00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000 -FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F -00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000 -FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000001FF0000FF -8000007FFFFC3FFFFF80007FFFFC3FFFFF80007FFFFC3FFFFF800039407FBF35>11 -D<000001FF000000001FFFC00000007F01F0000001FC0078000007F0001C00000FE0003E -00001FC000FF00003F8001FF00007F8001FF00007F0001FF00007F0001FF0000FE0001FF -0000FE0000FE0000FE0000380000FE0000000000FE0000000000FE0000000000FE000000 -0000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE000000 -0000FE00007F00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF0000FE0001FF0000FE0000FF -0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F -0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F -0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F -0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F -0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F -0001FF0000FF807FFFFC3FFFFE7FFFFC3FFFFE7FFFFC3FFFFE2F407FBF33>I<000001FF -800000001FFFF70000007F00FF000001F800FF000007F001FF00000FE001FF00001FC001 -FF00003F8001FF00007F8001FF00007F0001FF00007F0000FF0000FE00007F0000FE0000 -7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 -7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 -7F00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF0000FE00007F0000FE00007F0000FE0000 -7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 -7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 -7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 -7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 -7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0001FF0000 -FF807FFFFC3FFFFE7FFFFC3FFFFE7FFFFC3FFFFE2F407FBF33>I<000001FF0000FF8000 -00001FFFC00FFFE00000007F01F03F80F8000001F80078FE003C000007F0003FF8000E00 -000FE0007FF0001F00001FC000FFE0007F80003F8001FFC000FF80007F8001FFC000FF80 -007F0001FF8000FF80007F0001FF8000FF8000FE0001FF0000FF8000FE0000FF00007F00 -00FE00007F00001C0000FE00007F0000000000FE00007F0000000000FE00007F00000000 -00FE00007F0000000000FE00007F0000000000FE00007F0000000000FE00007F00000000 -00FE00007F0000000000FE00007F0000000000FE00007F0000000000FE00007F00003F80 -FFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFF8000FE00007F0000FF80 -00FE00007F00007F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F80 -00FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F80 -00FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F80 -00FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F80 -00FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F80 -00FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F80 -00FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F80 -00FE00007F00003F8000FE00007F00003F8000FE00007F00003F8001FF0000FF80007FC0 -7FFFFC3FFFFE1FFFFF7FFFFC3FFFFE1FFFFF7FFFFC3FFFFE1FFFFF48407FBF4C>I<003E -003F007F00FF00FF01FE03FC07F807F00FE01FC01F803E007C00F8007000200010116EBE -2D>19 D<1E000F007F803FC0FF807FC0FFC07FE0FFC07FE0FFE07FF0FFE07FF0FFE07FF0 -7FE03FF01E600F300060003000600030006000300060003000E0007000C0006000C00060 -00C0006001C000E0018000C0038001C003000180070003800E0007001C000E0018000C00 -38001C00300018001C1C7DBE2D>34 D<1E007F80FF80FFC0FFC0FFE0FFE0FFE07FE01E60 -006000600060006000E000C000C000C001C001800380030007000E001C00180038003000 -0B1C79BE19>39 D<0000300000700000E00001C0000380000780000F00001E00003E0000 -3C0000780000F80000F00001F00001E00003E00003E00007C00007C0000FC0000F80000F -80001F80001F00001F00003F00003F00003F00003E00007E00007E00007E00007E00007E -00007E00007C0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC -0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00007C00007E00007E00007E -00007E00007E00007E00003E00003F00003F00003F00001F00001F00001F80000F80000F -80000FC00007C00007C00003E00003E00001E00001F00000F00000F800007800003C0000 -3E00001E00000F000007800003800001C00000E0000070000030145A77C323>II<00000006000000000000000F0000 -00000000000F000000000000000F000000000000000F000000000000000F000000000000 -000F000000000000000F000000000000000F000000000000000F000000000000000F0000 -00000000000F000000000000000F000000000000000F000000000000000F000000000000 -000F000000000000000F000000000000000F000000000000000F000000000000000F0000 -00000000000F000000000000000F000000000000000F000000000000000F000000000000 -000F000000000000000F000000000000000F000000000000000F000000007FFFFFFFFFFF -FFE0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE00000000F000000000000 -000F000000000000000F000000000000000F000000000000000F000000000000000F0000 -00000000000F000000000000000F000000000000000F000000000000000F000000000000 -000F000000000000000F000000000000000F000000000000000F000000000000000F0000 -00000000000F000000000000000F000000000000000F000000000000000F000000000000 -000F000000000000000F000000000000000F000000000000000F000000000000000F0000 -00000000000F000000000000000F000000000000000F0000000000000006000000003C3C -7BB447>43 D<1E007F80FF80FFC0FFC0FFE0FFE0FFE07FE01E60006000600060006000E0 -00C000C000C001C001800380030007000E001C001800380030000B1C798919>II<1E007F807F80FFC0FFC0FFC0FFC0 -7F807F801E000A0A798919>I<000000018000000003C000000007C000000007C0000000 -07800000000F800000000F800000000F000000001F000000001F000000001E000000003E -000000003E000000003C000000007C000000007C000000007800000000F800000000F800 -000000F000000001F000000001F000000001E000000003E000000003E000000003C00000 -0007C000000007C000000007800000000F800000000F800000001F000000001F00000000 -1E000000003E000000003E000000003C000000007C000000007C000000007800000000F8 -00000000F800000000F000000001F000000001F000000001E000000003E000000003E000 -000003C000000007C000000007C000000007800000000F800000000F800000000F000000 -001F000000001F000000001E000000003E000000003E000000007C000000007C00000000 -7800000000F800000000F800000000F000000001F000000001F000000001E000000003E0 -00000003E000000003C000000007C000000007C000000007800000000F800000000F8000 -00000F000000001F000000001F000000001E000000003E000000003E000000003C000000 -007C000000007C000000007800000000F800000000F800000000F0000000006000000000 -225B7BC32D>I<0001FE0000000FFFC000003F03F000007C00F80000F8007C0001F0003E -0003E0001F0007C0000F8007C0000F800FC0000FC01F800007E01F800007E01F800007E0 -3F800007F03F800007F03F000003F07F000003F87F000003F87F000003F87F000003F87F -000003F87F000003F8FF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF00 -0003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF0000 -03FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003 -FC7F000003F87F000003F87F000003F87F000003F87F000003F83F800007F03F800007F0 -3F800007F01F800007E01F800007E01F800007E00FC0000FC00FC0000FC007E0001F8003 -E0001F0001F0003E0000F8007C00007C00F800003F03F000000FFFC0000001FE0000263F -7DBC2D>I<0001C0000003C0000007C000001FC000007FC00007FFC000FFFFC000FF9FC0 -00F81FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0 -00001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0 -00001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0 -00001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0 -00001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0 -00001FC000001FC000001FC000001FC000007FF000FFFFFFF8FFFFFFF8FFFFFFF81D3D78 -BC2D>I<0007FC0000003FFF800000FFFFE00003F01FF80007C007FC000F0001FE001E00 -00FF001C0000FF803C00007FC07800007FC07800003FE07000003FE0FF00003FE0FF8000 -1FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0001FF07F80001FF03F00001F -F00C00001FF00000001FE00000003FE00000003FE00000003FC00000007FC00000007F80 -000000FF80000000FF00000001FE00000001FC00000003F800000007F000000007E00000 -000FC00000001F800000003F000000007E000000007C00000000F800000001F000000003 -E000000007C00000000F800000001F000070003E000070003C000070007800007000F000 -00E001E00000E003C00000E007800000E00F000001E01FFFFFFFE01FFFFFFFE03FFFFFFF -E07FFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0243D7CBC2D>I<0007FC0000003FFF -800000F80FE00001E003F800078001FC000F0001FE000E0000FF001E0000FF801F80007F -803FC0007FC03FE0007FC03FE0007FC03FF0007FC03FE0007FC03FE0007FC01FE0007FC0 -0FC0007FC00000007F80000000FF80000000FF00000000FF00000001FE00000001FE0000 -0003FC00000003F800000007E00000000FC00000003F0000001FFC0000001FFF80000000 -0FE000000007F800000003FC00000001FE00000000FF00000000FF800000007FC0000000 -7FC00000007FE00000003FE00000003FE00000003FF00000003FF00C00003FF03F00003F -F07F80003FF0FFC0003FF0FFC0003FF0FFC0003FF0FFC0003FE0FFC0003FE0FF80007FE0 -7F00007FC07800007FC0780000FF803C0000FF801E0001FF000F0003FE0007C007FC0003 -F80FF00000FFFFE000003FFF80000007F80000243F7CBC2D>I<0000000E000000001E00 -0000003E000000003E000000007E000000007E00000000FE00000001FE00000001FE0000 -0003FE000000077E000000067E0000000E7E0000001C7E0000001C7E000000387E000000 -707E000000707E000000E07E000001C07E000001C07E000003807E000007007E00000700 -7E00000E007E00001C007E00001C007E000038007E000070007E000070007E0000E0007E -0000C0007E0001C0007E000380007E000300007E000700007E000E00007E000C00007E00 -1C00007E003800007E003800007E007000007E00E000007E00FFFFFFFFFFFFFFFFFFFFFF -FFFFFFFF000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000 -00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000001FF000001FF -FFFF0001FFFFFF0001FFFFFF283E7EBD2D>I<06000003000780001F0007F800FE0007FF -FFFE0007FFFFFC0007FFFFF80007FFFFF00007FFFFC00007FFFF000007FFFC0000073FE0 -000007000000000700000000070000000007000000000700000000070000000007000000 -00070000000007000000000700000000070000000007000000000701FE0000070FFF8000 -073E03E000077001F80007E000FC0007C0007E000780003F000700003F800600001F8000 -00001FC00000001FC00000001FE00000000FE00000000FE00000000FE00000000FF00000 -000FF00000000FF00C00000FF07F00000FF07F80000FF0FF80000FF0FF80000FF0FF8000 -0FF0FF80000FF0FF80000FE0FF00001FE0FC00001FE07000001FC07800001FC03800003F -803C00003F801E00007F001F0000FE000F8001FC0007C003F80003F80FE00000FFFFC000 -003FFF00000007F80000243F7CBC2D>I<00001FE0000000FFF8000003F03E00000FC00F -00001F000780003E000780007E001FC000FC003FC001F8007FC003F8007FC003F0007FC0 -07F0007FC00FE0003F800FE0001F001FE00000001FC00000001FC00000003FC00000003F -C00000003FC00000007F800000007F800000007F80FE00007F87FF8000FF8F07E000FF9C -01F000FFB800FC00FFB0007E00FFF0007E00FFE0003F00FFE0003F80FFC0003FC0FFC000 -3FC0FFC0001FE0FFC0001FE0FFC0001FE0FF80001FF0FF80001FF0FF80001FF0FF80001F -F0FF80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF0 -3F80001FF03FC0001FE03FC0001FE01FC0001FE01FC0003FC01FC0003FC00FE0003F800F -E0003F8007E0007F0003F0007E0001F800FC0000FC01F800007E07F000003FFFE000000F -FF80000003FC0000243F7CBC2D>I<38000000003C000000003F000000003FFFFFFFFC3F -FFFFFFFC3FFFFFFFFC3FFFFFFFF87FFFFFFFF87FFFFFFFF07FFFFFFFE078000001E07000 -0003C0700000078070000007007000000F00E000001E00E000001C00E000003C00E00000 -78000000007000000000F000000001E000000001C000000003C000000007800000000700 -0000000F000000001E000000001E000000003C000000003C000000007C00000000780000 -0000F800000000F800000001F800000001F000000003F000000003F000000003F0000000 -07F000000007F000000007F00000000FF00000000FE00000000FE00000001FE00000001F -E00000001FE00000001FE00000001FE00000001FE00000003FE00000003FE00000003FE0 -0000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE000 -00001FC00000000700000026407BBD2D>I<0003FC0000001FFF8000007C07E00000F001 -F80001E0007C0003C0003E000780001F000F00001F000F00000F801E00000F801E00000F -C03E000007C03E000007C03E000007C03E000007C03F000007C03F000007C03F80000F80 -3FC0000F801FE0001F801FF0001F001FFC003E000FFE007C000FFF80780007FFC0F00003 -FFF3E00001FFFF800000FFFF0000003FFF0000001FFFC000000FFFE000003FFFF8000078 -FFFC0001F07FFE0003E01FFF0007C00FFF800F8003FFC01F0001FFC03F00007FE03E0000 -3FE07E00001FE07C00000FF07C000007F0F8000003F0F8000003F0F8000003F0F8000001 -F0F8000001F0F8000001F0F8000001F0FC000001E07C000003E07C000003E07E000003C0 -3F000007C01F00000F801F80001F000FC0003E0007F0007C0001FC03F80000FFFFE00000 -1FFF80000003FC0000243F7CBC2D>I<0003FC0000001FFF0000007E07C00000FC03F000 -01F801F80003F000FC0007E0007C000FE0007E001FC0007F001FC0003F003FC0003F803F -80003F807F80003FC07F80003FC07F80001FC0FF80001FC0FF80001FE0FF80001FE0FF80 -001FE0FF80001FE0FF80001FE0FF80001FF0FF80001FF0FF80001FF0FF80001FF0FF8000 -1FF07F80001FF07F80003FF07F80003FF07F80003FF03FC0003FF03FC0003FF01FC0007F -F00FC0007FF007E000FFF007F000DFF003F001DFF000F8039FF0007E0F1FF0001FFE1FE0 -0007F01FE00000001FE00000001FE00000003FC00000003FC00000003FC00000003FC000 -00003F800000007F800F80007F001FC0007F003FE000FE003FE000FE003FE001FC003FE0 -01F8003FC003F0003F8007F0001E000FE0001F001FC0000FC07F000003FFFE000001FFF8 -0000003FC00000243F7CBC2D>I<1E007F807F80FFC0FFC0FFC0FFC07F807F801E000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -1E007F807F80FFC0FFC0FFC0FFC07F807F801E000A2779A619>I<1E007F807F80FFC0FF -C0FFC0FFC07F807F801E0000000000000000000000000000000000000000000000000000 -000000000000000000000000001E007F00FF80FF80FFC0FFC0FFC0FFC07FC01EC000C000 -C000C000C001C001800180018003800300070006000E000C001C003800300030000A3979 -A619>I<7FFFFFFFFFFFFFE0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE0 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000007FFFFFFFFFFFFFE0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE0 -3C167BA147>61 D<00000007000000000000000F800000000000000F800000000000000F -800000000000001FC00000000000001FC00000000000001FC00000000000003FE0000000 -0000003FE00000000000003FE00000000000007FF00000000000007FF00000000000007F -F0000000000000FFF8000000000000E7F8000000000000E7F8000000000001C7FC000000 -000001C3FC000000000001C3FC00000000000381FE00000000000381FE00000000000381 -FE00000000000700FF00000000000700FF00000000000700FF00000000000E007F800000 -00000E007F80000000000E007F80000000001C003FC0000000001C003FC0000000001C00 -3FC00000000038001FE00000000038001FE00000000038001FE00000000070000FF00000 -000070000FF00000000070000FF000000000E00007F800000000E00007F800000000E000 -07F800000001C00003FC00000001FFFFFFFC00000001FFFFFFFC00000003FFFFFFFE0000 -0003800001FE00000003800001FE00000007000000FF00000007000000FF0000000F0000 -00FF8000000E0000007F8000000E0000007F8000001E0000007FC000001C0000003FC000 -001C0000003FC000003C0000003FE00000380000001FE00000380000001FE00000780000 -001FF00000780000000FF00000FC0000000FF00003FC0000001FF8000FFF0000003FFC00 -FFFFF0000FFFFFF8FFFFF0000FFFFFF8FFFFF0000FFFFFF83D417DC044>65 -DI<0000003FF00006000003FFFE000E00000FFFFF801E00003FF007 -E03E0000FF8000F83E0003FE00007C7E0007F800001EFE000FF000000FFE003FE0000007 -FE007FC0000003FE00FF80000003FE00FF00000001FE01FE00000000FE03FE00000000FE -07FC000000007E07F8000000007E0FF8000000003E0FF8000000003E1FF0000000001E1F -F0000000001E3FF0000000001E3FE0000000001E3FE0000000000E7FE0000000000E7FE0 -000000000E7FE0000000000E7FC00000000000FFC00000000000FFC00000000000FFC000 -00000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000 -000000FFC00000000000FFC00000000000FFC00000000000FFC000000000007FC0000000 -00007FE000000000007FE0000000000E7FE0000000000E3FE0000000000E3FE000000000 -0E3FF0000000000E1FF0000000001E1FF0000000001C0FF8000000001C0FF8000000001C -07F8000000003C07FC000000003803FE000000007801FE000000007000FF00000000F000 -FF80000001E0007FC0000001C0003FE0000003C0000FF0000007800007F800001F000003 -FE00003E000000FF8000F80000003FF007F00000000FFFFFC000000003FFFF0000000000 -3FF0000037427BBF42>IIII<0000003FE0000C00 -000003FFFE001C0000001FFFFF803C0000007FF00FC07C000000FF0001F07C000003FC00 -0078FC000007F800003DFC00001FE000001FFC00003FC000000FFC00007F80000007FC00 -00FF80000003FC0001FF00000003FC0001FE00000001FC0003FC00000001FC0007FC0000 -0000FC0007F800000000FC000FF8000000007C000FF0000000007C001FF0000000003C00 -1FF0000000003C003FE0000000003C003FE0000000003C003FE0000000001C007FE00000 -00001C007FE0000000001C007FC0000000001C007FC0000000000000FFC0000000000000 -FFC0000000000000FFC0000000000000FFC0000000000000FFC0000000000000FFC00000 -00000000FFC0000000000000FFC0000000000000FFC0000000000000FFC0000000000000 -FFC0000000000000FFC000001FFFFFF07FC000001FFFFFF07FC000001FFFFFF07FE00000 -000FFE007FE000000003FC003FE000000003FC003FE000000003FC003FF000000003FC00 -1FF000000003FC001FF000000003FC000FF800000003FC000FF800000003FC0007F80000 -0003FC0007FC00000003FC0003FC00000003FC0001FE00000003FC0001FF00000003FC00 -00FF80000003FC00007FC0000007FC00003FE0000007FC00001FF000000FFC000007F800 -001EFC000003FE00003C7C000000FF8000F83C0000007FF007F01C0000001FFFFFC00C00 -000003FFFF0000000000003FF00000003C427BBF47>III<001FFFFFFC001FFFFFFC00 -1FFFFFFC000007FF00000003FE00000001FE00000001FE00000001FE00000001FE000000 -01FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001 -FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE -00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00 -000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE0000 -0001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE000000 -01FE00000001FE003F0001FE007F8001FE00FFC001FE00FFC001FE00FFC001FE00FFC001 -FE00FFC003FC00FF8003FC007F0003F8007C0007F800380007F0003C000FE0001E001FC0 -000F003F800003E07E000000FFF80000003FC0000026407CBD2F>I -76 DII<0000007FE0000000000007FFFE00000000001F -C03F80000000007E0007E000000001FC0003F800000007F00000FE0000000FE000007F00 -00001FC000003F8000003F8000001FC000007F0000000FE00000FE00000007F00001FE00 -000007F80001FC00000003F80003FC00000003FC0007F800000001FE0007F800000001FE -000FF000000000FF000FF000000000FF001FF000000000FF801FE0000000007F803FE000 -0000007FC03FE0000000007FC03FE0000000007FC07FE0000000007FE07FC0000000003F -E07FC0000000003FE07FC0000000003FE0FFC0000000003FF0FFC0000000003FF0FFC000 -0000003FF0FFC0000000003FF0FFC0000000003FF0FFC0000000003FF0FFC0000000003F -F0FFC0000000003FF0FFC0000000003FF0FFC0000000003FF0FFC0000000003FF0FFC000 -0000003FF07FC0000000003FE07FE0000000007FE07FE0000000007FE07FE0000000007F -E07FE0000000007FE03FE0000000007FC03FE0000000007FC01FF000000000FF801FF000 -000000FF801FF000000000FF800FF800000001FF000FF800000001FF0007FC00000003FE -0003FC00000003FC0003FE00000007FC0001FE00000007F80000FF0000000FF000007F00 -00000FE000003F8000001FC000001FC000003F8000000FE000007F00000007F00000FE00 -000001FC0003F8000000007F000FE0000000001FC03F800000000007FFFE000000000000 -7FE00000003C427BBF47>II82 -D<0007FC000C001FFF801C007FFFF03C01FC03F83C03F0007E7C07C0001FFC0F80000FFC -1F800007FC3F000003FC3E000001FC7E000000FC7E000000FC7C0000007CFC0000007CFC -0000007CFC0000003CFC0000003CFC0000003CFE0000001CFE0000001CFF0000001CFF00 -00001C7F800000007FC00000007FE00000003FF80000003FFF8000001FFFF800000FFFFF -800007FFFFF00003FFFFFC0001FFFFFF0000FFFFFFC0003FFFFFE00007FFFFF000007FFF -F0000007FFF80000007FFC0000000FFC00000007FE00000003FE00000001FE00000000FF -00000000FFE00000007FE00000007FE00000007FE00000003FE00000003FF00000003FF0 -0000003FF00000003FF00000003EF80000003EF80000007EFC0000007CFE000000FCFF00 -0000F8FF800001F8FFC00003F0FFE00007E0F9FC000FC0F07F803F80F01FFFFE00E007FF -F800C0007FC00028427BBF33>I<3FFFFFFFFFFFFF803FFFFFFFFFFFFF803FFFFFFFFFFF -FF803FF0007FE001FF803F80003FC0003F807F00003FC0001FC07E00003FC00007C07C00 -003FC00007C07800003FC00003C07800003FC00003C07800003FC00003C07000003FC000 -01C07000003FC00001C07000003FC00001C07000003FC00001C07000003FC00001C0E000 -003FC00000E0E000003FC00000E0E000003FC00000E0E000003FC00000E0E000003FC000 -00E00000003FC00000000000003FC00000000000003FC00000000000003FC00000000000 -003FC00000000000003FC00000000000003FC00000000000003FC00000000000003FC000 -00000000003FC00000000000003FC00000000000003FC00000000000003FC00000000000 -003FC00000000000003FC00000000000003FC00000000000003FC00000000000003FC000 -00000000003FC00000000000003FC00000000000003FC00000000000003FC00000000000 -003FC00000000000003FC00000000000003FC00000000000003FC00000000000003FC000 -00000000003FC00000000000003FC00000000000003FC00000000000003FC00000000000 -003FC00000000000003FC00000000000003FC00000000000003FC00000000000007FE000 -0000000000FFF00000000007FFFFFFFE00000007FFFFFFFE00000007FFFFFFFE00003B3D -7DBC42>IIII91 -D<018000C0038001C003000180070003800E0007001C000E0018000C0038001C00300018 -0070003800600030006000300060003000E0007000C0006000C0006000C0006000C00060 -00CF006780FFC07FE0FFE07FF0FFE07FF0FFE07FF07FE03FF07FE03FF03FE01FF03FC01F -E00F0007801C1C73BE2D>II<000FF800000000FFFE00000003F01F -800000078007E000000F8003F000000FE001F800001FF001FC00001FF000FE00001FF000 -FE00001FF000FE00001FF0007F00000FE0007F00000380007F00000000007F0000000000 -7F00000000007F00000000007F000000001FFF00000003FFFF0000001FF87F0000007F80 -7F000001FC007F000007F8007F00000FE0007F00001FC0007F00003F80007F00003F8000 -7F00007F00007F00007F00007F0380FE00007F0380FE00007F0380FE00007F0380FE0000 -FF0380FE0000FF0380FE0000FF03807F0001FF03807F0003BF03803F80071F87001FC00E -1FCF0007F03C0FFE0001FFF807FC00003FC001F000292A7DA82D>97 -D<01FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC03FC00 -0001FC1FFF800001FC7C07E00001FDE001F00001FFC000FC0001FF80007E0001FF00003F -0001FE00003F8001FC00001F8001FC00001FC001FC00000FE001FC00000FE001FC00000F -F001FC00000FF001FC000007F001FC000007F801FC000007F801FC000007F801FC000007 -F801FC000007F801FC000007F801FC000007F801FC000007F801FC000007F801FC000007 -F801FC000007F001FC000007F001FC00000FF001FC00000FF001FC00000FE001FC00001F -E001FC00001FC001FE00001F8001FE00003F0001FF00007F0001FF8000FE0001F3C001F8 -0001F1E003F00001E0780FC00001C03FFF0000000007F800002D407EBE33>I<0001FF00 -00000FFFE000003F00F800007C001E0001F8001F0003F0007F0007F000FF800FE000FF80 -0FC000FF801FC000FF801FC000FF803F80007F003F80001C007F800000007F800000007F -00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00 -000000FF00000000FF00000000FF00000000FF000000007F800000007F800000007F8000 -00003F800001C03FC00001C01FC00003C01FC00003800FE000078007F000070003F0000E -0001F8001E0000FC007800003F01F000000FFFC0000001FE0000222A7DA828>I<000000 -01FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC00000000 -01FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC00000000 -01FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC00000000 -01FC0000000001FC0000000001FC0000000001FC0000000001FC000000FF01FC000007FF -E1FC00001F80F9FC00007E003DFC0000FC001FFC0003F80007FC0007F00007FC0007E000 -03FC000FC00001FC001FC00001FC003FC00001FC003F800001FC007F800001FC007F8000 -01FC007F000001FC007F000001FC00FF000001FC00FF000001FC00FF000001FC00FF0000 -01FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF0000 -01FC007F000001FC007F800001FC007F800001FC003F800001FC003F800001FC001FC000 -01FC000FC00003FC000FE00003FC0007E00007FC0003F0000FFE0001F8001FFF00007C00 -79FFF8003F01F1FFF8000FFFC1FFF80001FE01FC002D407DBE33>I<0001FE0000000FFF -C000003F03F00000FC01F80001F800FC0003F0007E0007E0003F000FE0003F800FC0001F -801FC0001FC03F80000FC03F80000FC07F80000FC07F80000FE07F00000FE07F00000FE0 -FF00000FE0FF00000FE0FFFFFFFFE0FFFFFFFFE0FF00000000FF00000000FF00000000FF -00000000FF00000000FF000000007F000000007F000000007F800000003F800000003F80 -0000E01FC00000E01FC00001E00FC00001C007E00003C007F000078003F800070000FC00 -1E00007E003C00001F80F8000007FFE0000000FF0000232A7EA828>I<00001FC000007F -F80001F83C0007E07E000FC0FF001FC1FF003F81FF003F01FF007F01FF007F00FE00FE00 -7C00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 -0000FE000000FE000000FE000000FE000000FE0000FFFFFF00FFFFFF00FFFFFF0000FE00 -0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 -0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 -0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 -0000FE000000FE000000FE000000FE000001FF00007FFFFF007FFFFF007FFFFF0020407E -BF1C>I<000000007C000003F801FF00001FFF078F80007E0FDE1F8000F803F81F8003F0 -01F81F8003F001F81F8007E000FC06000FE000FE00000FC0007E00001FC0007F00001FC0 -007F00001FC0007F00001FC0007F00001FC0007F00001FC0007F00001FC0007F00001FC0 -007F00000FC0007E00000FE000FE000007E000FC000003F001F8000003F001F8000001F8 -03E0000003FE0FC00000071FFF0000000703F80000000600000000000E00000000000E00 -000000000E00000000000F00000000000F00000000000F80000000000FC00000000007FF -FFE0000007FFFFFE000003FFFFFF800001FFFFFFE00000FFFFFFF00003FFFFFFF8000FC0 -001FFC001F000001FE003E000000FE007C0000007E007C0000003F00F80000003F00F800 -00001F00F80000001F00F80000001F00F80000001F00FC0000003F007C0000003E007E00 -00007E003F000000FC001F800001F8000FC00003F00003F0000FC00000FE007F0000003F -FFFC00000003FFC00000293D7EA82D>I<01FC00000000FFFC00000000FFFC00000000FF -FC0000000007FC0000000003FC0000000001FC0000000001FC0000000001FC0000000001 -FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 -FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 -FC0000000001FC0000000001FC01FE000001FC07FFC00001FC1E07E00001FC7803F00001 -FCE001F80001FDC001FC0001FD8001FC0001FF8000FE0001FF0000FE0001FF0000FE0001 -FE0000FE0001FE0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 -FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 -FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 -FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 -FC0000FE0001FC0000FE0003FE0001FF00FFFFF87FFFFCFFFFF87FFFFCFFFFF87FFFFC2E -3F7DBE33>I<01E00007F80007F8000FFC000FFC000FFC000FFC0007F80007F80001E000 -000000000000000000000000000000000000000000000000000000000000000000000000 -01FC007FFC007FFC007FFC0007FC0003FC0001FC0001FC0001FC0001FC0001FC0001FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 -03FE00FFFFF0FFFFF0FFFFF0143E7DBD1A>I<0000780001FE0001FE0003FF0003FF0003 -FF0003FF0001FE0001FE0000780000000000000000000000000000000000000000000000 -0000000000000000000000000000007F007FFF007FFF007FFF0001FF0000FF00007F0000 -7F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0000 -7F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0000 -7F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0000 -7F00007F00007F00007F3E007F7F007FFF807EFF80FEFF80FEFF80FCFF81F87F01F87C03 -F01E07C00FFF8001FC00185185BD1C>I<01FC00000000FFFC00000000FFFC00000000FF -FC0000000007FC0000000003FC0000000001FC0000000001FC0000000001FC0000000001 -FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 -FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 -FC0000000001FC0000000001FC0000000001FC00FFFF8001FC00FFFF8001FC00FFFF8001 -FC003FFC0001FC003FE00001FC003F800001FC003F000001FC003C000001FC0078000001 -FC00F0000001FC01E0000001FC07C0000001FC0F80000001FC1F00000001FC3E00000001 -FC7F00000001FCFF80000001FDFF80000001FFDFC0000001FF9FE0000001FF0FE0000001 -FE07F0000001FC07F8000001F803FC000001F801FC000001F801FE000001F800FF000001 -F8007F000001F8007F800001F8003FC00001F8001FC00001F8001FE00001F8000FF00001 -F8000FF00001F8000FF80003FC000FFE00FFFFF07FFFE0FFFFF07FFFE0FFFFF07FFFE02B -3F7EBE30>I<01FC00FFFC00FFFC00FFFC0007FC0003FC0001FC0001FC0001FC0001FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 -01FC0003FE00FFFFF8FFFFF8FFFFF8153F7DBE1A>I<01F801FE0000FF0000FFF807FFC0 -03FFE000FFF81E07E00F03F000FFF87803F03C01F80007F8E001F87000FC0003F9C001FC -E000FE0001F98001FCC000FE0001FB8000FFC0007F0001FB0000FF80007F0001FF0000FF -80007F0001FE0000FF00007F0001FE0000FF00007F0001FC0000FE00007F0001FC0000FE -00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE -00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE -00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE -00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE -00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE -00007F0001FC0000FE00007F0001FC0000FE00007F0003FE0001FF0000FF80FFFFF87FFF -FC3FFFFEFFFFF87FFFFC3FFFFEFFFFF87FFFFC3FFFFE47287DA74C>I<01F801FE0000FF -F807FFC000FFF81E07E000FFF87803F00007F8E001F80003F9C001FC0001F98001FC0001 -FB8000FE0001FB0000FE0001FF0000FE0001FE0000FE0001FE0000FE0001FC0000FE0001 -FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 -FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 -FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 -FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0003FE0001FF00FF -FFF87FFFFCFFFFF87FFFFCFFFFF87FFFFC2E287DA733>I<0000FF00000007FFE000001F -81F800007E007E0000F8001F0001F0000F8003E00007C007C00003E00FC00003F01F8000 -01F81F800001F83F800001FC3F800001FC7F000000FE7F000000FE7F000000FE7F000000 -FEFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FF -FF000000FFFF000000FF7F000000FE7F000000FE7F000000FE3F800001FC3F800001FC3F -800001FC1F800001F80FC00003F00FC00003F007E00007E003F0000FC001F8001F80007E -007E00003F81FC00000FFFF0000000FF0000282A7EA82D>I<01FC03FC0000FFFC1FFF80 -00FFFC7C0FE000FFFDE003F00003FFC001FC0001FF8000FE0001FF00007F0001FE00003F -8001FC00003F8001FC00001FC001FC00001FE001FC00001FE001FC00000FF001FC00000F -F001FC00000FF001FC000007F801FC000007F801FC000007F801FC000007F801FC000007 -F801FC000007F801FC000007F801FC000007F801FC000007F801FC000007F801FC00000F -F001FC00000FF001FC00000FF001FC00000FF001FC00001FE001FC00001FE001FC00003F -C001FE00003F8001FE00007F0001FF00007F0001FF8000FE0001FFC001F80001FDE007F0 -0001FC780FC00001FC3FFF000001FC07F8000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000003FE00000000FFFFF80000 -00FFFFF8000000FFFFF80000002D3A7EA733>I<0000FF001C000007FFC03C00001F80F0 -3C00007F00387C0000FC001C7C0003F8000E7C0007F0000FFC0007F00007FC000FE00003 -FC001FE00003FC003FC00003FC003FC00001FC007F800001FC007F800001FC007F800001 -FC007F800001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF000001 -FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC007F800001 -FC007F800001FC007F800001FC003FC00001FC003FC00001FC001FC00003FC000FE00003 -FC000FE00007FC0007F0000FFC0003F8000FFC0001FC003DFC00007E0079FC00003F81F1 -FC00000FFFC1FC000001FE01FC0000000001FC0000000001FC0000000001FC0000000001 -FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 -FC0000000001FC0000000001FC0000000001FC0000000003FE00000000FFFFF8000000FF -FFF8000000FFFFF82D3A7DA730>I<01F807E0FFF81FF8FFF8787CFFF8E1FE07F9C1FE03 -F981FE01FB81FE01FB01FE01FB00FC01FF003001FE000001FE000001FE000001FC000001 -FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001 -FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001 -FC000001FC000001FC000001FC000003FE0000FFFFFE00FFFFFE00FFFFFE001F287EA724 ->I<003FC06001FFF8E007C03FE01F000FE03E0007E03C0003E07C0003E0780001E0F800 -01E0F80000E0F80000E0FC0000E0FE0000E0FF0000E0FF8000007FF800007FFFC0003FFF -F8001FFFFE000FFFFF0007FFFF8001FFFFC0003FFFE00003FFF000001FF000000FF8E000 -03F8E00003F8E00001F8F00001F8F00000F8F00000F8F80000F8F80000F0FC0000F0FC00 -01F0FE0001E0FF0003C0FF800780F3E01F00E0FFFC00C01FE0001D2A7DA824>I<001C00 -00001C0000001C0000001C0000001C0000001C0000003C0000003C0000003C0000003C00 -00007C0000007C000000FC000000FC000001FC000003FC000007FC00001FFFFFC0FFFFFF -C0FFFFFFC001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00 -0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00 -0001FC000001FC000001FC000001FC00E001FC00E001FC00E001FC00E001FC00E001FC00 -E001FC00E001FC00E001FC00E000FC00E000FE01C000FE01C0007F03C0003F0380001F87 -000007FE000001F8001B397EB723>I<01FC0000FE00FFFC007FFE00FFFC007FFE00FFFC -007FFE0007FC0003FE0003FC0001FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC -0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC -0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC -0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC -0000FE0001FC0000FE0001FC0001FE0001FC0001FE0001FC0001FE0001FC0003FE0000FC -0003FE0000FC0007FE0000FE0006FF00007E000EFF80003F001CFFFC001FC078FFFC0007 -FFE0FFFC0000FF80FE002E297DA733>IIIII<1F -FFFFFF801FFFFFFF801FE000FF801F8000FF001F0001FE001E0003FC001C0003FC001C00 -07F8003C000FF0003C001FF00038001FE00038003FC00038007FC00038007F80003800FF -00000001FE00000001FE00000003FC00000007F80000000FF80000000FF00000001FE000 -00003FC00380003FC00380007F80038000FF00038001FF00038001FE00038003FC000780 -07FC00078007F80007000FF00007001FE0000F001FE0000F003FC0001F007F80007F00FF -8001FF00FFFFFFFF00FFFFFFFF0021277EA628>I124 D E /Fq 45 122 df<00000000FFFC00000000 -00001FFFFF800000000001FFFFFFE00000000007FFFFFFF0000000001FFFC00FF8000000 -007FFE0003FC00000000FFF00000FE00000001FFE00003FF00000003FF800007FF000000 -07FF00000FFF8000000FFE00001FFF8000000FFE00001FFF8000001FFC00001FFF800000 -1FFC00003FFFC000003FFC00001FFF8000003FF800001FFF8000003FF800001FFF800000 -3FF800001FFF8000003FF800000FFF0000003FF8000007FE0000003FF8000001F8000000 -3FF8000000000000003FF8000000000000003FF8000000000000003FF800000000000000 -3FF8000000000000003FF8000000000000003FF8000000000000003FF800000000000000 -3FF8000000000000003FF80003FFFFC000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFC000FF -FFFFFFFFFFFFC000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFC000003FFC000007FFC00000 -3FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC00000 -3FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC00000 -3FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC00000 -3FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC00000 -3FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC00000 -3FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC00000 -3FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC00000 -3FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC00000 -3FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC00000 -3FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC000003FFC00000 -3FFC000003FFC000003FFC000003FFC0003FFFFFFC03FFFFFFC03FFFFFFC03FFFFFFC03F -FFFFFC03FFFFFFC03FFFFFFC03FFFFFFC03FFFFFFC03FFFFFFC042547DD34B>12 -D45 -D<000000780000000000FC0000000003FC0000000007FC000000001FFC00000000FFFC00 -00000FFFFC000007FFFFFC0000FFFFFFFC0000FFFFFFFC0000FFFF7FFC0000FFF07FFC00 -00F8007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 -0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 -0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 -0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 -0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 -0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 -0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 -0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 -0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 -0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00 -0000007FFC00007FFFFFFFFFFE7FFFFFFFFFFE7FFFFFFFFFFE7FFFFFFFFFFE7FFFFFFFFF -FE2F4E76CD43>49 D<00003FFE0000000003FFFFE00000000FFFFFFC0000003FFFFFFF00 -0000FFFFFFFFC00001FFC07FFFE00003FE000FFFF80007F80003FFFC000FE00001FFFE00 -1FC00000FFFF003F8000007FFF003FF000007FFF807FF800003FFFC07FFC00003FFFC0FF -FE00001FFFE0FFFF00001FFFE0FFFF00001FFFE0FFFF00000FFFF0FFFF00000FFFF0FFFF -00000FFFF0FFFF00000FFFF0FFFF00000FFFF07FFE00000FFFF07FFE00000FFFF03FFC00 -000FFFF00FF000000FFFF003C000000FFFF0000000000FFFE0000000001FFFE000000000 -1FFFE0000000001FFFC0000000003FFFC0000000003FFF80000000003FFF80000000007F -FF00000000007FFE0000000000FFFC0000000001FFF80000000001FFF00000000003FFE0 -0000000003FFC00000000007FF80000000000FFF00000000001FFE00000000001FFC0000 -0000003FF800000000007FE00000000000FFC00000000001FF800000000003FE00000000 -0007FC000000000007F800000000000FF00001F000001FE00001F000003F800001F00000 -7F000001F00000FE000003E00001FC000003E00003F8000003E00007F0000003E0000FE0 -000003E0001F80000007E0003F00000007E0003E0000000FE0007FFFFFFFFFE000FFFFFF -FFFFC001FFFFFFFFFFC003FFFFFFFFFFC007FFFFFFFFFFC00FFFFFFFFFFFC01FFFFFFFFF -FFC03FFFFFFFFFFFC07FFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFF80FFFFFFFFFFFF -80FFFFFFFFFFFF80FFFFFFFFFFFF80344E79CD43>I<00000FFFC000000000FFFFFC0000 -0007FFFFFF8000001FFFFFFFE000003FF807FFF00000FF8001FFFC0001FE00007FFE0003 -F800003FFF0003F000003FFF8007FC00001FFF800FFF00001FFFC00FFF80001FFFC01FFF -C0001FFFE01FFFC0001FFFE01FFFC0001FFFE01FFFC0001FFFE01FFFE0001FFFE01FFFC0 -001FFFE01FFFC0001FFFE01FFFC0001FFFE00FFFC0001FFFC007FF80001FFFC003FF0000 -3FFFC001FC00003FFF80000000003FFF80000000007FFF00000000007FFE00000000007F -FE0000000000FFFC0000000001FFF80000000003FFF00000000007FFC0000000000FFF80 -00000000FFFE00000000FFFFF800000000FFFFE000000000FFFFFC00000000FFFFFF8000 -00000007FFE00000000001FFF800000000007FFE00000000003FFF00000000001FFF8000 -0000000FFFC0000000000FFFE00000000007FFF00000000007FFF00000000007FFF80000 -000007FFF80000000003FFFC0000000003FFFC0000000003FFFE0000000003FFFE03E000 -0003FFFE0FF8000003FFFE1FFC000003FFFE3FFE000003FFFE7FFF000003FFFEFFFF8000 -03FFFEFFFF800003FFFEFFFF800003FFFEFFFF800003FFFCFFFF800003FFFCFFFF800007 -FFFCFFFF800007FFF8FFFF000007FFF87FFF000007FFF07FFE00000FFFF03FFC00000FFF -E03FF000001FFFC01FE000003FFF800FF800007FFF0007FF0000FFFE0003FFF007FFFC00 -00FFFFFFFFF000007FFFFFFFE000001FFFFFFF80000003FFFFFC000000001FFF80000037 -4F7ACD43>I<00000000007C00000000000000FE00000000000000FE00000000000001FE -00000000000003FE00000000000007FE0000000000000FFE0000000000000FFE00000000 -00001FFE0000000000003FFE0000000000007FFE0000000000007FFE000000000000FFFE -000000000001FFFE000000000003FFFE000000000003FFFE000000000007FFFE00000000 -000FFFFE00000000001FBFFE00000000003F3FFE00000000003E3FFE00000000007C3FFE -0000000000FC3FFE0000000001F83FFE0000000001F03FFE0000000003E03FFE00000000 -07E03FFE000000000FC03FFE000000000F803FFE000000001F003FFE000000003F003FFE -000000007E003FFE000000007C003FFE00000000F8003FFE00000001F8003FFE00000003 -F0003FFE00000007E0003FFE00000007C0003FFE0000000F80003FFE0000001F80003FFE -0000003F00003FFE0000003E00003FFE0000007C00003FFE000000FC00003FFE000001F8 -00003FFE000001F000003FFE000003E000003FFE000007E000003FFE00000FC000003FFE -00001F8000003FFE00001F0000003FFE00003E0000003FFE00007E0000003FFE0000FC00 -00003FFE0000FFFFFFFFFFFFFFC0FFFFFFFFFFFFFFC0FFFFFFFFFFFFFFC0FFFFFFFFFFFF -FFC0FFFFFFFFFFFFFFC0000000007FFE0000000000007FFE0000000000007FFE00000000 -00007FFE0000000000007FFE0000000000007FFE0000000000007FFE0000000000007FFE -0000000000007FFE0000000000007FFE0000000000007FFE0000000000007FFE00000000 -00007FFE0000000000007FFE0000000000007FFE000000000FFFFFFFFFC000000FFFFFFF -FFC000000FFFFFFFFFC000000FFFFFFFFFC000000FFFFFFFFFC03A4F7CCE43>I<038000 -00000E0007E00000007E0007FE000003FE0007FFF0007FFE0007FFFFFFFFFC0007FFFFFF -FFF80007FFFFFFFFF00007FFFFFFFFE00007FFFFFFFFC00007FFFFFFFF800007FFFFFFFF -000007FFFFFFFE000007FFFFFFFC000007FFFFFFF0000007FFFFFFC0000007FFFFFF0000 -0007FFFFF800000007E1FF0000000007E0000000000007E0000000000007E00000000000 -07E0000000000007E0000000000007E0000000000007E0000000000007E0000000000007 -E0000000000007E0000000000007E0000000000007E00FFF00000007E07FFFF0000007E3 -FFFFFE000007E7FFFFFF800007FFF807FFC00007FFC001FFE00007FE0000FFF80007FC00 -007FFC0007F800003FFC0007F000003FFE0007E000001FFF0003C000001FFF8000000000 -1FFF80000000001FFFC0000000000FFFC0000000000FFFE0000000000FFFE0000000000F -FFE0000000000FFFE0000000000FFFF0000000000FFFF0000000000FFFF00FE000000FFF -F01FF000000FFFF03FF800000FFFF07FFC00000FFFF0FFFE00000FFFF0FFFE00000FFFF0 -FFFE00000FFFF0FFFE00000FFFF0FFFE00000FFFE0FFFE00000FFFE0FFFE00000FFFE0FF -FC00000FFFE07FF800001FFFC07FF000001FFFC07FE000001FFF803E0000003FFF803F00 -00003FFF001F8000007FFE001FC000007FFC000FE00000FFF80007F80001FFF00003FE00 -07FFE00001FFC03FFFC00000FFFFFFFF8000003FFFFFFE0000001FFFFFF800000003FFFF -C0000000007FF8000000344F79CD43>I<0000000FFF0000000000FFFFE000000007FFFF -F00000001FFFFFFC0000007FFE03FE000001FFF0007F000003FFC0003F800007FF00001F -80000FFE00007FC0001FFC0000FFC0003FF80001FFE0007FF00003FFE000FFF00007FFE0 -01FFE00007FFE001FFE00007FFE003FFC00007FFE007FFC00007FFE007FFC00007FFE00F -FFC00003FFC00FFF800001FF801FFF800000FF001FFF8000007E001FFF80000000003FFF -80000000003FFF80000000003FFF00000000007FFF00000000007FFF00000000007FFF00 -080000007FFF01FFF800007FFF07FFFF0000FFFF0FFFFFC000FFFF1FFFFFF000FFFF3F00 -7FF800FFFF3C003FFC00FFFF78001FFE00FFFFF0000FFF00FFFFF00007FF80FFFFE00007 -FFC0FFFFE00007FFC0FFFFC00007FFE0FFFFC00003FFF0FFFF800003FFF0FFFF800003FF -F8FFFF800003FFF8FFFF800003FFF8FFFF800003FFF8FFFF000003FFFCFFFF000003FFFC -FFFF000003FFFC7FFF000003FFFC7FFF000003FFFC7FFF000003FFFC7FFF000003FFFC7F -FF000003FFFC7FFF000003FFFC3FFF000003FFFC3FFF000003FFFC3FFF000003FFFC3FFF -000003FFFC1FFF000003FFF81FFF800003FFF81FFF800003FFF80FFF800003FFF80FFF80 -0003FFF007FF800007FFF007FF800007FFE003FFC00007FFC001FFC00007FFC001FFE000 -0FFF8000FFF0000FFF00007FF8001FFE00003FFC007FFC00001FFF01FFF800000FFFFFFF -F0000003FFFFFFC0000000FFFFFF000000003FFFFC0000000007FFC00000364F7ACD43> -I<1F000000000000001F800000000000001FC00000000000001FFF8000000000001FFFFF -FFFFFFFF801FFFFFFFFFFFFF801FFFFFFFFFFFFF801FFFFFFFFFFFFF803FFFFFFFFFFFFF -803FFFFFFFFFFFFF003FFFFFFFFFFFFE003FFFFFFFFFFFFC003FFFFFFFFFFFF8003FFFFF -FFFFFFF8003FFFFFFFFFFFF0003FFFFFFFFFFFE0003FFFFFFFFFFFC0007FFFFFFFFFFF80 -007F800000007F00007E00000000FF00007E00000001FE00007C00000003FC00007C0000 -0003F800007C00000007F000007C0000000FF000007C0000001FE00000F80000003FC000 -00F80000007F800000F80000007F000000F8000000FE00000000000001FE000000000000 -03FC00000000000003F800000000000007F00000000000000FF00000000000001FE00000 -000000001FE00000000000003FC00000000000003FC00000000000007F80000000000000 -FF80000000000000FF80000000000001FF00000000000001FF00000000000003FF000000 -00000003FE00000000000007FE00000000000007FE0000000000000FFE0000000000000F -FE0000000000000FFC0000000000001FFC0000000000001FFC0000000000003FFC000000 -0000003FFC0000000000003FFC0000000000003FFC0000000000007FFC0000000000007F -F80000000000007FF80000000000007FF8000000000000FFF8000000000000FFF8000000 -000000FFF8000000000000FFF8000000000000FFF8000000000001FFF8000000000001FF -F8000000000001FFF8000000000001FFF8000000000001FFF8000000000001FFF8000000 -000001FFF8000000000001FFF8000000000001FFF8000000000001FFF8000000000001FF -F8000000000001FFF8000000000000FFF0000000000000FFF00000000000003FC0000000 -0000001F8000000000395279D043>I<000007FFC0000000007FFFFC00000003FFFFFF80 -00000FFFFFFFE000001FFC01FFF800003FE0003FFC00007F80000FFE0000FF000007FF00 -01FE000003FF0003FC000001FF8007FC000001FFC007F8000000FFC00FF8000000FFC00F -F8000000FFE00FF80000007FE00FF80000007FE01FF80000007FE01FFC0000007FE01FFC -0000007FE01FFE0000007FE01FFF0000007FE01FFF800000FFE01FFFE00000FFC01FFFF8 -0000FFC01FFFFE0001FF800FFFFF0001FF800FFFFFC003FF000FFFFFF007FE0007FFFFF8 -07FC0007FFFFFE1FF80003FFFFFFBFF00001FFFFFFFFE00001FFFFFFFF800000FFFFFFFE -0000007FFFFFFF0000003FFFFFFF8000000FFFFFFFE0000007FFFFFFF0000001FFFFFFFC -000007FFFFFFFE00001FFFFFFFFF00003FFFFFFFFF8000FFE7FFFFFF8001FF81FFFFFFC0 -03FF007FFFFFE007FE001FFFFFF00FFC000FFFFFF01FF80003FFFFF01FF80000FFFFF83F -F000007FFFF83FF000001FFFF87FE0000007FFFC7FE0000001FFFC7FE0000000FFFCFFC0 -0000007FFCFFC00000003FFCFFC00000003FFCFFC00000001FFCFFC00000001FFCFFC000 -00000FFCFFC00000000FFCFFC00000000FF8FFC00000000FF8FFE00000000FF87FE00000 -000FF07FF00000001FF07FF00000001FF03FF80000003FE01FF80000003FC01FFC000000 -7FC00FFE000000FF8007FF800003FF0003FFE0000FFE0001FFFC00FFFC00007FFFFFFFF0 -00003FFFFFFFE000000FFFFFFF80000001FFFFFC000000000FFFC00000364F7ACD43>I< -00000FFF8000000000FFFFF800000003FFFFFE0000000FFFFFFF8000001FFF03FFC00000 -7FF800FFE00000FFF0003FF00001FFE0001FF80003FFC0001FFC0007FFC0000FFE000FFF -80000FFF000FFF800007FF001FFF800007FF803FFF800007FF803FFF000007FFC07FFF00 -0007FFC07FFF000003FFE07FFF000003FFE07FFF000003FFF0FFFF000003FFF0FFFF0000 -03FFF0FFFF000003FFF0FFFF000003FFF8FFFF000003FFF8FFFF000003FFF8FFFF000003 -FFF8FFFF000003FFF8FFFF000003FFF8FFFF000003FFFCFFFF000003FFFCFFFF000003FF -FCFFFF000003FFFC7FFF000007FFFC7FFF000007FFFC7FFF000007FFFC3FFF000007FFFC -3FFF000007FFFC3FFF00000FFFFC1FFF80000FFFFC0FFF80001FFFFC0FFF80001FFFFC07 -FF80003FFFFC03FFC0003FFFFC01FFE0007BFFFC00FFF000F3FFFC007FF803F3FFFC001F -FFFFE3FFFC000FFFFFC3FFFC0003FFFF83FFF800007FFE03FFF80000004003FFF8000000 -0003FFF80000000003FFF80000000003FFF00000000007FFF00000000007FFF000000000 -07FFF001F8000007FFE003FC000007FFE007FE000007FFC00FFF000007FFC01FFF80000F -FF801FFF80000FFF801FFF80000FFF001FFF80001FFF001FFF80001FFE001FFF80003FFC -001FFF00003FFC000FFE00007FF8000FFC0000FFF0000FF80001FFE00007F00003FFC000 -03FC000FFF800003FF807FFE000001FFFFFFFC0000007FFFFFF00000003FFFFFC0000000 -0FFFFE0000000000FFF0000000364F7ACD43>I<00000000001F00000000000000000000 -003F80000000000000000000007FC0000000000000000000007FC0000000000000000000 -00FFE000000000000000000000FFE000000000000000000000FFE0000000000000000000 -01FFF000000000000000000001FFF000000000000000000003FFF8000000000000000000 -03FFF800000000000000000003FFF800000000000000000007FFFC000000000000000000 -07FFFC00000000000000000007FFFC0000000000000000000FFFFE000000000000000000 -0FFFFE0000000000000000001FFFFF0000000000000000001FFFFF000000000000000000 -1FFFFF0000000000000000003FFFFF8000000000000000003F7FFF800000000000000000 -7F7FFFC000000000000000007E7FFFC000000000000000007E3FFFC00000000000000000 -FE3FFFE00000000000000000FC1FFFE00000000000000001FC1FFFF00000000000000001 -F81FFFF00000000000000001F80FFFF00000000000000003F80FFFF80000000000000003 -F007FFF80000000000000007F007FFFC0000000000000007E007FFFC0000000000000007 -E003FFFC000000000000000FE003FFFE000000000000000FC001FFFE000000000000001F -C001FFFF000000000000001F8001FFFF000000000000001F8000FFFF000000000000003F -8000FFFF800000000000003F00007FFF800000000000007F00007FFFC00000000000007E -00007FFFC00000000000007E00003FFFC0000000000000FE00003FFFE0000000000000FC -00001FFFE0000000000001FC00001FFFF0000000000001F800001FFFF0000000000001F8 -00000FFFF0000000000003F800000FFFF8000000000003F0000007FFF8000000000007F0 -000007FFFC000000000007E0000007FFFC000000000007E0000003FFFC00000000000FFF -FFFFFFFFFE00000000000FFFFFFFFFFFFE00000000001FFFFFFFFFFFFF00000000001FFF -FFFFFFFFFF00000000001FFFFFFFFFFFFF00000000003F80000000FFFF80000000003F00 -0000007FFF80000000007F000000007FFFC0000000007F000000007FFFC0000000007E00 -0000003FFFC000000000FE000000003FFFE000000000FC000000001FFFE000000001FC00 -0000001FFFF000000001FC000000001FFFF000000001F8000000000FFFF000000003F800 -0000000FFFF800000003F00000000007FFF800000007F00000000007FFFC00000007F000 -00000007FFFC00000007E00000000003FFFC0000000FE00000000003FFFE0000000FC000 -00000003FFFE0000001FC00000000001FFFF000000FFFC0000000001FFFF0000FFFFFFF8 -00000FFFFFFFFFE0FFFFFFF800000FFFFFFFFFE0FFFFFFF800000FFFFFFFFFE0FFFFFFF8 -00000FFFFFFFFFE0FFFFFFF800000FFFFFFFFFE05B547BD366>65 -D<0000000001FFFC000001C0000000007FFFFFC00003C000000007FFFFFFF80007C00000 -003FFFFFFFFE001FC0000000FFFFFFFFFF803FC0000003FFFFE003FFC07FC000000FFFFC -00003FF0FFC000003FFFE000000FF9FFC000007FFF80000003FFFFC00001FFFE00000000 -FFFFC00003FFF8000000007FFFC00007FFF0000000003FFFC0000FFFE0000000001FFFC0 -001FFFC0000000000FFFC0003FFF800000000007FFC0007FFF000000000003FFC000FFFE -000000000001FFC000FFFE000000000001FFC001FFFC000000000000FFC003FFF8000000 -000000FFC003FFF80000000000007FC007FFF00000000000007FC00FFFF0000000000000 -3FC00FFFF00000000000003FC01FFFE00000000000001FC01FFFE00000000000001FC01F -FFE00000000000001FC03FFFC00000000000001FC03FFFC00000000000000FC03FFFC000 -00000000000FC07FFFC00000000000000FC07FFFC00000000000000FC07FFFC000000000 -000000007FFF8000000000000000007FFF800000000000000000FFFF8000000000000000 -00FFFF800000000000000000FFFF800000000000000000FFFF800000000000000000FFFF -800000000000000000FFFF800000000000000000FFFF800000000000000000FFFF800000 -000000000000FFFF800000000000000000FFFF800000000000000000FFFF800000000000 -000000FFFF800000000000000000FFFF800000000000000000FFFF800000000000000000 -7FFF8000000000000000007FFF8000000000000000007FFFC000000000000000007FFFC0 -00000000000000007FFFC000000000000007C03FFFC000000000000007C03FFFC0000000 -00000007C03FFFC000000000000007C01FFFE000000000000007C01FFFE0000000000000 -07C01FFFE00000000000000FC00FFFF00000000000000F800FFFF00000000000000F8007 -FFF00000000000001F8003FFF80000000000001F8003FFF80000000000001F0001FFFC00 -00000000003F0000FFFE0000000000007E0000FFFE0000000000007E00007FFF00000000 -0000FC00003FFF800000000001F800001FFFC00000000003F800000FFFE00000000007F0 -000007FFF0000000000FE0000003FFFC000000001FC0000001FFFE000000007F80000000 -7FFF80000000FF000000003FFFE0000007FE000000000FFFFE00001FF80000000003FFFF -E001FFF00000000000FFFFFFFFFFC000000000003FFFFFFFFF00000000000007FFFFFFFC -000000000000007FFFFFE00000000000000001FFFC00000000525479D261>67 -DIII73 -D76 D80 D<00000FFF8000070000 -00FFFFF8000F000007FFFFFF001F00001FFFFFFFC03F00003FFFFFFFF07F0000FFFC00FF -F8FF0001FFE0000FFDFF0003FF800001FFFF0007FE0000007FFF000FFC0000003FFF000F -F80000000FFF001FF800000007FF001FF000000003FF003FF000000003FF003FE0000000 -01FF007FE000000000FF007FE000000000FF007FE0000000007F00FFE0000000007F00FF -E0000000003F00FFE0000000003F00FFF0000000003F00FFF0000000003F00FFF8000000 -001F00FFF8000000001F00FFFC000000001F00FFFE000000001F00FFFF000000000000FF -FFC000000000007FFFF000000000007FFFFF00000000007FFFFFF8000000003FFFFFFF80 -0000003FFFFFFFFC0000001FFFFFFFFFC000001FFFFFFFFFF000000FFFFFFFFFFC000007 -FFFFFFFFFF000003FFFFFFFFFFC00001FFFFFFFFFFE00000FFFFFFFFFFF000007FFFFFFF -FFF800003FFFFFFFFFFC00000FFFFFFFFFFE000003FFFFFFFFFE000000FFFFFFFFFF0000 -001FFFFFFFFF80000000FFFFFFFF800000000FFFFFFFC0000000007FFFFFC00000000007 -FFFFE00000000000FFFFE000000000003FFFE000000000000FFFF0000000000007FFF000 -0000000003FFF0000000000003FFF0780000000001FFF0F80000000000FFF0F800000000 -00FFF0F80000000000FFF0F800000000007FF0F800000000007FF0FC00000000007FF0FC -00000000007FF0FC00000000007FE0FE00000000007FE0FE00000000007FE0FF00000000 -00FFC0FF0000000000FFC0FF8000000000FFC0FFC000000001FF80FFE000000001FF00FF -F000000003FF00FFFC00000007FE00FFFF0000000FFC00FFFFC000001FF800FFFFF80000 -7FF000FF1FFFC003FFE000FE0FFFFFFFFFC000FC03FFFFFFFF0000F8007FFFFFFC0000F0 -000FFFFFF00000E000007FFF0000003C5479D24B>83 D<3FFFFFFFFFFFFFFFFFFF803FFF -FFFFFFFFFFFFFFFF803FFFFFFFFFFFFFFFFFFF803FFFFFFFFFFFFFFFFFFF803FFFFFFFFF -FFFFFFFFFF803FFFC0003FFFC0007FFF803FFE00003FFFC00007FF807FF800003FFFC000 -01FFC07FE000003FFFC00000FFC07FC000003FFFC000007FC07F8000003FFFC000003FC0 -7F0000003FFFC000001FC07F0000003FFFC000001FC07E0000003FFFC000000FC07E0000 -003FFFC000000FC07E0000003FFFC000000FC07C0000003FFFC0000007C07C0000003FFF -C0000007C07C0000003FFFC0000007C07C0000003FFFC0000007C07C0000003FFFC00000 -07C0FC0000003FFFC0000007E0F80000003FFFC0000003E0F80000003FFFC0000003E0F8 -0000003FFFC0000003E0F80000003FFFC0000003E0F80000003FFFC0000003E0F8000000 -3FFFC0000003E0000000003FFFC000000000000000003FFFC000000000000000003FFFC0 -00000000000000003FFFC000000000000000003FFFC000000000000000003FFFC0000000 -00000000003FFFC000000000000000003FFFC000000000000000003FFFC0000000000000 -00003FFFC000000000000000003FFFC000000000000000003FFFC000000000000000003F -FFC000000000000000003FFFC000000000000000003FFFC000000000000000003FFFC000 -000000000000003FFFC000000000000000003FFFC000000000000000003FFFC000000000 -000000003FFFC000000000000000003FFFC000000000000000003FFFC000000000000000 -003FFFC000000000000000003FFFC000000000000000003FFFC000000000000000003FFF -C000000000000000003FFFC000000000000000003FFFC000000000000000003FFFC00000 -0000000000003FFFC000000000000000003FFFC000000000000000003FFFC00000000000 -0000003FFFC000000000000000003FFFC000000000000000003FFFC00000000000000000 -3FFFC000000000000000003FFFC000000000000000003FFFC000000000000000003FFFC0 -00000000000000003FFFC000000000000000003FFFC000000000000000003FFFC0000000 -00000000003FFFC000000000000000003FFFC000000000000000003FFFC0000000000000 -00003FFFC000000000000000003FFFC000000000000000003FFFC0000000000000FFFFFF -FFFFFFF000000000FFFFFFFFFFFFF000000000FFFFFFFFFFFFF000000000FFFFFFFFFFFF -F000000000FFFFFFFFFFFFF0000053517BD05E>I86 D<00007FFF000000000007FFFFF0000000003FFF -FFFE00000000FFFFFFFF80000001FFE00FFFC0000003FE0001FFF0000007FF0000FFF800 -0007FF80003FFC00000FFF80003FFE00000FFFC0001FFE00000FFFC0001FFF00000FFFC0 -000FFF80000FFFC0000FFF80000FFFC0000FFF800007FF800007FFC00007FF800007FFC0 -0003FF000007FFC00001FE000007FFC0000000000007FFC0000000000007FFC000000000 -0007FFC0000000000007FFC0000000000007FFC0000000000007FFC0000000007FFFFFC0 -0000000FFFFFFFC0000000FFFFFFFFC0000007FFFF87FFC000003FFFF007FFC000007FFF -8007FFC00001FFFC0007FFC00003FFF00007FFC00007FFE00007FFC0000FFFC00007FFC0 -001FFF800007FFC0003FFF000007FFC0007FFF000007FFC0007FFE000007FFC0007FFE00 -0007FFC000FFFC000007FFC000FFFC000007FFC000FFFC000007FFC000FFFC000007FFC0 -00FFFC00000FFFC000FFFC00000FFFC000FFFE00001FFFC0007FFE00001DFFC0007FFE00 -003DFFC0003FFF000079FFE0001FFF8000F1FFF8000FFFC003E1FFFFE007FFF81FC0FFFF -F003FFFFFF807FFFF000FFFFFF001FFFF0001FFFFC0007FFE00001FFE0000000003C387C -B641>97 D<003FF0000000000000FFFFF0000000000000FFFFF0000000000000FFFFF000 -0000000000FFFFF0000000000000FFFFF000000000000003FFF000000000000000FFF000 -000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -000000000000FFF000000000000000FFF001FFE000000000FFF00FFFFE00000000FFF03F -FFFFC0000000FFF0FFFFFFF0000000FFF3FF01FFF8000000FFF7F8003FFE000000FFFFE0 -000FFF000000FFFF800007FF800000FFFF000003FFC00000FFFE000001FFE00000FFFC00 -0001FFF00000FFF8000000FFF80000FFF8000000FFF80000FFF80000007FFC0000FFF800 -00007FFC0000FFF80000007FFE0000FFF80000007FFE0000FFF80000007FFF0000FFF800 -00003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF80000003FFF8000FFF800 -00003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF800 -00003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF800 -00003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF0000FFF800 -00003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF80000007FFE0000FFF800 -00007FFE0000FFF80000007FFE0000FFF80000007FFC0000FFF8000000FFFC0000FFF800 -0000FFF80000FFFC000001FFF00000FFFC000001FFF00000FFFE000003FFE00000FFFF00 -0007FFC00000FFFF80000FFF800000FFCFC0001FFF000000FF87F0007FFC000000FF03FE -03FFF8000000FE00FFFFFFE0000000FC007FFFFF80000000F8001FFFFC00000000000003 -FFC000000041547BD24B>I<000001FFF8000000001FFFFF80000000FFFFFFF0000003FF -FFFFFC00000FFFC00FFE00001FFE0001FF00007FFC0003FF8000FFF00007FF8001FFF000 -07FFC003FFE0000FFFC003FFC0000FFFC007FFC0000FFFC00FFF80000FFFC00FFF80000F -FFC01FFF800007FF801FFF000007FF803FFF000003FF003FFF000001FE007FFF00000000 -007FFE00000000007FFE00000000007FFE0000000000FFFE0000000000FFFE0000000000 -FFFE0000000000FFFE0000000000FFFE0000000000FFFE0000000000FFFE0000000000FF -FE0000000000FFFE0000000000FFFE0000000000FFFE0000000000FFFE0000000000FFFE -00000000007FFE00000000007FFF00000000007FFF00000000003FFF00000000003FFF00 -000000003FFF00000003E01FFF80000003E01FFF80000007E00FFFC0000007C007FFC000 -0007C007FFE000000FC003FFE000001F8001FFF000003F0000FFF800007E00007FFE0000 -FC00003FFF0003F800000FFFE01FF0000003FFFFFFE0000000FFFFFF800000003FFFFE00 -00000001FFE0000033387CB63C>I<000000000001FF80000000000007FFFF8000000000 -0007FFFF80000000000007FFFF80000000000007FFFF80000000000007FFFF8000000000 -00001FFF8000000000000007FF8000000000000007FF8000000000000007FF8000000000 -000007FF8000000000000007FF8000000000000007FF8000000000000007FF8000000000 -000007FF8000000000000007FF8000000000000007FF8000000000000007FF8000000000 -000007FF8000000000000007FF8000000000000007FF8000000000000007FF8000000000 -000007FF8000000000000007FF8000000000000007FF8000000000000007FF8000000000 -000007FF8000000000000007FF8000000000000007FF8000000001FFE007FF800000001F -FFFC07FF80000000FFFFFF07FF80000003FFFFFFC7FF8000000FFFE03FE7FF8000001FFF -0007F7FF8000007FFC0001FFFF800000FFF80000FFFF800001FFF000003FFF800003FFE0 -00001FFF800007FFC000001FFF800007FFC000000FFF80000FFF8000000FFF80001FFF80 -00000FFF80001FFF0000000FFF80003FFF0000000FFF80003FFF0000000FFF80003FFF00 -00000FFF80007FFE0000000FFF80007FFE0000000FFF80007FFE0000000FFF80007FFE00 -00000FFF8000FFFE0000000FFF8000FFFE0000000FFF8000FFFE0000000FFF8000FFFE00 -00000FFF8000FFFE0000000FFF8000FFFE0000000FFF8000FFFE0000000FFF8000FFFE00 -00000FFF8000FFFE0000000FFF8000FFFE0000000FFF8000FFFE0000000FFF8000FFFE00 -00000FFF80007FFE0000000FFF80007FFE0000000FFF80007FFE0000000FFF80003FFF00 -00000FFF80003FFF0000000FFF80003FFF0000000FFF80001FFF0000000FFF80001FFF00 -00000FFF80000FFF8000000FFF80000FFF8000001FFF800007FFC000003FFF800003FFC0 -00003FFF800001FFE000007FFF800000FFF00001FFFF8000007FF80003FFFFE000003FFE -000FEFFFFF80000FFFC07FCFFFFF800007FFFFFF8FFFFF800001FFFFFE0FFFFF8000003F -FFF80FFFFF80000003FFC00FFE000041547CD24B>I<000003FFC0000000003FFFFC0000 -0001FFFFFF00000007FFFFFFC000000FFF81FFE000003FFC007FF800007FF8003FFC0000 -FFF0001FFE0001FFE0000FFE0003FFC00007FF0007FFC00007FF800FFF800003FF800FFF -800003FFC01FFF800001FFC01FFF000001FFC03FFF000001FFE03FFF000001FFE07FFF00 -0000FFE07FFE000000FFE07FFE000000FFF07FFE000000FFF0FFFE000000FFF0FFFE0000 -00FFF0FFFE000000FFF0FFFE000000FFF0FFFFFFFFFFFFF0FFFFFFFFFFFFF0FFFFFFFFFF -FFF0FFFFFFFFFFFFE0FFFE0000000000FFFE0000000000FFFE0000000000FFFE00000000 -00FFFE0000000000FFFE00000000007FFE00000000007FFE00000000007FFF0000000000 -3FFF00000000003FFF00000000003FFF00000000E01FFF00000001F01FFF80000003F00F -FF80000003F007FFC0000007E007FFC0000007E003FFE000000FC001FFF000001FC000FF -F800003F80007FFC0000FF00001FFE0003FE00000FFFC03FF8000003FFFFFFF0000000FF -FFFFC00000001FFFFE0000000001FFF0000034387CB63D>I<0000003FFC00000003FFFF -0000000FFFFFC000003FFFFFE00000FFF81FF00001FFC03FF80003FF807FF80007FF00FF -FC000FFE00FFFC001FFC00FFFC001FFC00FFFC003FF800FFFC003FF800FFFC003FF8007F -F8007FF0007FF8007FF0003FF0007FF0000FC0007FF0000000007FF0000000007FF00000 -00007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000 -00007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000FFFFFFFFE0 -00FFFFFFFFE000FFFFFFFFE000FFFFFFFFE000FFFFFFFFE000007FF8000000007FF80000 -00007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF80000 -00007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF80000 -00007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF80000 -00007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF80000 -00007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF80000 -00007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF80000 -00007FF8000000007FF8000000007FF8000000007FF8000000007FF80000007FFFFFFE00 -007FFFFFFE00007FFFFFFE00007FFFFFFE00007FFFFFFE00002E547CD329>I<00003FFF -0000FF000003FFFFF007FFC0000FFFFFFC1FFFE0003FFFFFFF7FFFE0007FFC0FFFFF9FF0 -00FFE001FFF83FF001FFC000FFE03FF003FF80007FF01FF007FF00003FF81FE00FFF0000 -3FFC0FC00FFF00003FFC07801FFE00001FFE00001FFE00001FFE00003FFE00001FFF0000 -3FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE0000 -1FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00001FFE00001FFE0000 -1FFE00001FFE00000FFF00003FFC00000FFF00003FFC000007FF00003FF8000003FF8000 -7FF0000001FFC000FFE0000000FFE001FFC0000000FFFC0FFF80000001FFFFFFFF000000 -03EFFFFFFC00000003C3FFFFF000000007C03FFF0000000007C000000000000007C00000 -000000000FC00000000000000FC00000000000000FC00000000000000FE0000000000000 -0FE00000000000000FF80000000000000FFE0000000000000FFFFFFFFF00000007FFFFFF -FFF8000007FFFFFFFFFF000007FFFFFFFFFFC00003FFFFFFFFFFE00001FFFFFFFFFFF000 -00FFFFFFFFFFF800007FFFFFFFFFFC00007FFFFFFFFFFE0001FFFFFFFFFFFF0007FFFFFF -FFFFFF000FFE000003FFFF801FF80000003FFF803FF000000007FF807FE000000003FFC0 -7FE000000001FFC0FFC000000001FFC0FFC000000000FFC0FFC000000000FFC0FFC00000 -0000FFC0FFC000000000FFC0FFC000000000FFC0FFE000000001FFC07FE000000001FF80 -7FF000000003FF803FF000000003FF001FF800000007FE000FFE0000001FFC0007FF8000 -007FF80003FFE00001FFF00001FFFE001FFFE000007FFFFFFFFF8000000FFFFFFFFC0000 -0001FFFFFFE0000000000FFFFC0000003C4F7CB543>I<003FF0000000000000FFFFF000 -0000000000FFFFF0000000000000FFFFF0000000000000FFFFF0000000000000FFFFF000 -000000000003FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000 -1FFC00000000FFF000FFFFC0000000FFF003FFFFF0000000FFF00FFFFFF8000000FFF01F -E07FFC000000FFF03F001FFE000000FFF07C001FFF000000FFF0F0000FFF000000FFF1E0 -000FFF800000FFF3C0000FFF800000FFF7800007FF800000FFF7800007FFC00000FFFF00 -0007FFC00000FFFE000007FFC00000FFFE000007FFC00000FFFC000007FFC00000FFFC00 -0007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC000FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF8 -07FFFFFFC0FFFFFFF807FFFFFFC042537BD24B>I<007F000000FF800003FFE00007FFF0 -0007FFF0000FFFF8000FFFF8000FFFF8000FFFF8000FFFF8000FFFF8000FFFF80007FFF0 -0007FFF00003FFE00000FF8000007F000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000003FF0 -00FFFFF000FFFFF000FFFFF000FFFFF000FFFFF00001FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF000FFFFFFE0FFFFFFE0FFFFFFE0FFFFFFE0FFFFFFE01B547B -D325>I<003FF00000000000FFFFF00000000000FFFFF00000000000FFFFF00000000000 -FFFFF00000000000FFFFF0000000000003FFF0000000000000FFF0000000000000FFF000 -0000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF00000000000 -00FFF0000000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF000 -0000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF00000000000 -00FFF0000000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF000 -0000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF00001FFFFF8 -00FFF00001FFFFF800FFF00001FFFFF800FFF00001FFFFF800FFF00001FFFFF800FFF000 -003FFE0000FFF000001FF00000FFF000003FC00000FFF000007F800000FFF00000FF0000 -00FFF00003FE000000FFF00007F8000000FFF0000FF0000000FFF0001FE0000000FFF000 -7FC0000000FFF000FF00000000FFF001FE00000000FFF003FC00000000FFF00FF8000000 -00FFF01FE000000000FFF03FF000000000FFF07FF800000000FFF1FFF800000000FFF3FF -FC00000000FFF7FFFE00000000FFFFFFFF00000000FFFFFFFF80000000FFFF9FFF800000 -00FFFF0FFFC0000000FFFE0FFFE0000000FFF807FFF0000000FFF003FFF0000000FFF001 -FFF8000000FFF000FFFC000000FFF000FFFE000000FFF0007FFF000000FFF0003FFF0000 -00FFF0001FFF800000FFF0001FFFC00000FFF0000FFFE00000FFF00007FFF00000FFF000 -03FFF00000FFF00001FFF80000FFF00001FFFC0000FFF00000FFFE0000FFF000007FFE00 -00FFF000003FFF0000FFF000007FFFC0FFFFFFF003FFFFFFFFFFFFF003FFFFFFFFFFFFF0 -03FFFFFFFFFFFFF003FFFFFFFFFFFFF003FFFFFF40537CD247>107 -D<003FF000FFFFF000FFFFF000FFFFF000FFFFF000FFFFF00001FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF0 -0000FFF00000FFF00000FFF00000FFF00000FFF00000FFF000FFFFFFF0FFFFFFF0FFFFFF -F0FFFFFFF0FFFFFFF01C537BD225>I<003FF0001FFC000000FFE00000FFFFF000FFFFC0 -0007FFFE0000FFFFF003FFFFF0001FFFFF8000FFFFF00FFFFFF8007FFFFFC000FFFFF01F -E07FFC00FF03FFE000FFFFF03F001FFE01F800FFF00003FFF07C001FFF03E000FFF80000 -FFF0F0000FFF0780007FF80000FFF1E0000FFF8F00007FFC0000FFF3C0000FFF9E00007F -FC0000FFF7800007FFBC00003FFC0000FFF7800007FFFC00003FFE0000FFFF000007FFF8 -00003FFE0000FFFE000007FFF000003FFE0000FFFE000007FFF000003FFE0000FFFC0000 -07FFE000003FFE0000FFFC000007FFE000003FFE0000FFFC000007FFE000003FFE0000FF -FC000007FFE000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE -0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000 -003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007 -FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8 -000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE00 -00FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC00000 -3FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FF -C000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF800 -0007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000 -FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003F -FE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC0 -00003FFE00FFFFFFF807FFFFFFC03FFFFFFEFFFFFFF807FFFFFFC03FFFFFFEFFFFFFF807 -FFFFFFC03FFFFFFEFFFFFFF807FFFFFFC03FFFFFFEFFFFFFF807FFFFFFC03FFFFFFE6736 -7BB570>I<003FF0001FFC000000FFFFF000FFFFC00000FFFFF003FFFFF00000FFFFF00F -FFFFF80000FFFFF01FE07FFC0000FFFFF03F001FFE000003FFF07C001FFF000000FFF0F0 -000FFF000000FFF1E0000FFF800000FFF3C0000FFF800000FFF7800007FF800000FFF780 -0007FFC00000FFFF000007FFC00000FFFE000007FFC00000FFFE000007FFC00000FFFC00 -0007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF800 -0007FFC00000FFF8000007FFC000FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF8 -07FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC042367BB54B>I<000001FFE000 -000000001FFFFE0000000000FFFFFFC000000003FFFFFFF00000000FFF807FFC0000001F -FC000FFE0000007FF80007FF800000FFF00003FFC00001FFE00001FFE00003FFC00000FF -F00003FF8000007FF00007FF8000007FF8000FFF0000003FFC000FFF0000003FFC001FFF -0000003FFE001FFF0000003FFE003FFE0000001FFF003FFE0000001FFF003FFE0000001F -FF007FFE0000001FFF807FFE0000001FFF807FFE0000001FFF807FFE0000001FFF80FFFE -0000001FFFC0FFFE0000001FFFC0FFFE0000001FFFC0FFFE0000001FFFC0FFFE0000001F -FFC0FFFE0000001FFFC0FFFE0000001FFFC0FFFE0000001FFFC0FFFE0000001FFFC0FFFE -0000001FFFC0FFFE0000001FFFC0FFFE0000001FFFC07FFE0000001FFF807FFE0000001F -FF807FFE0000001FFF803FFE0000001FFF003FFF0000003FFF003FFF0000003FFF001FFF -0000003FFE001FFF0000003FFE000FFF0000003FFC000FFF8000007FFC0007FF8000007F -F80003FFC00000FFF00001FFE00001FFE00000FFF00003FFC000007FF80007FF8000003F -FE001FFF0000000FFF807FFC00000007FFFFFFF800000000FFFFFFC0000000003FFFFF00 -0000000001FFE00000003A387CB643>I<003FF001FFE0000000FFFFF00FFFFE000000FF -FFF03FFFFFC00000FFFFF0FFFFFFF00000FFFFF3FF01FFF80000FFFFF7F8007FFE000003 -FFFFE0001FFF000000FFFF80000FFF800000FFFF000007FFC00000FFFE000007FFE00000 -FFFC000003FFF00000FFF8000001FFF80000FFF8000001FFF80000FFF8000000FFFC0000 -FFF8000000FFFC0000FFF8000000FFFE0000FFF80000007FFE0000FFF80000007FFF0000 -FFF80000007FFF0000FFF80000007FFF0000FFF80000007FFF0000FFF80000003FFF8000 -FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000 -FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000 -FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF0000 -FFF80000007FFF0000FFF80000007FFF0000FFF80000007FFF0000FFF80000007FFE0000 -FFF8000000FFFE0000FFF8000000FFFE0000FFF8000000FFFC0000FFF8000001FFFC0000 -FFF8000001FFF80000FFFC000003FFF00000FFFC000003FFF00000FFFE000007FFE00000 -FFFF00000FFFC00000FFFF80001FFF800000FFFFC0003FFF000000FFFFF000FFFC000000 -FFFBFE07FFF8000000FFF8FFFFFFE0000000FFF87FFFFF80000000FFF81FFFFC00000000 -FFF803FFC000000000FFF800000000000000FFF800000000000000FFF800000000000000 -FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000000 -FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000000 -FFF800000000000000FFF800000000000000FFF800000000000000FFF800000000000000 -FFF800000000000000FFF8000000000000FFFFFFF80000000000FFFFFFF80000000000FF -FFFFF80000000000FFFFFFF80000000000FFFFFFF80000000000414D7BB54B>I<007FE0 -03FE00FFFFE00FFF80FFFFE03FFFE0FFFFE07FFFF0FFFFE0FE1FF8FFFFE1F83FFC03FFE3 -E03FFE00FFE3C07FFE00FFE7807FFE00FFEF807FFE00FFEF007FFE00FFEE007FFE00FFFE -003FFC00FFFC003FFC00FFFC001FF800FFFC000FF000FFF800000000FFF800000000FFF8 -00000000FFF800000000FFF800000000FFF000000000FFF000000000FFF000000000FFF0 -00000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF0 -00000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF0 -00000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF0 -00000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF0 -000000FFFFFFFC0000FFFFFFFC0000FFFFFFFC0000FFFFFFFC0000FFFFFFFC00002F367C -B537>114 D<0003FFF00F00003FFFFE1F0000FFFFFFFF0003FFFFFFFF0007FF003FFF00 -0FF80007FF001FE00001FF003FC00000FF003F8000007F007F8000007F007F0000003F00 -7F0000003F00FF0000001F00FF0000001F00FF8000001F00FF8000001F00FFC000001F00 -FFF000000000FFFC00000000FFFFC00000007FFFFF0000007FFFFFF800003FFFFFFF0000 -3FFFFFFFC0001FFFFFFFF0000FFFFFFFF80007FFFFFFFC0003FFFFFFFE0000FFFFFFFF00 -003FFFFFFF80000FFFFFFFC00000FFFFFFC0000007FFFFE00000003FFFE000000007FFF0 -00000001FFF0780000007FF0F80000003FF0F80000001FF0FC0000001FF0FC0000000FF0 -FC0000000FF0FE0000000FF0FE0000000FE0FF0000000FE0FF8000001FE0FF8000001FC0 -FFC000001FC0FFE000003F80FFF800007F00FFFE0001FE00FFFFC00FFC00FF7FFFFFF800 -FC1FFFFFE000F807FFFF8000F000FFF800002C387CB635>I<00003E00000000003E0000 -0000003E00000000003E00000000003E00000000003E00000000007E00000000007E0000 -0000007E00000000007E0000000000FE0000000000FE0000000001FE0000000001FE0000 -000001FE0000000003FE0000000007FE0000000007FE000000000FFE000000001FFE0000 -00003FFE00000000FFFE00000001FFFE0000000FFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF -00FFFFFFFFFF00FFFFFFFFFF00003FFE000000003FFE000000003FFE000000003FFE0000 -00003FFE000000003FFE000000003FFE000000003FFE000000003FFE000000003FFE0000 -00003FFE000000003FFE000000003FFE000000003FFE000000003FFE000000003FFE0000 -00003FFE000000003FFE000000003FFE000000003FFE000000003FFE000000003FFE0000 -00003FFE000000003FFE000000003FFE000000003FFE000000003FFE000000003FFE0007 -C0003FFE0007C0003FFE0007C0003FFE0007C0003FFE0007C0003FFE0007C0003FFE0007 -C0003FFE0007C0003FFE0007C0003FFE0007C0003FFE0007C0001FFE000F80001FFF000F -80001FFF000F80000FFF001F00000FFF801F000007FFC03E000003FFF0FC000001FFFFF8 -0000007FFFF00000001FFFE000000003FF80002A4D7ECB34>I<003FF8000001FFC000FF -FFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FF -FFF80007FFFFC00003FFF800001FFFC00000FFF8000007FFC00000FFF8000007FFC00000 -FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000 -FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000 -FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000 -FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000 -FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000 -FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000 -FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000 -FFF8000007FFC00000FFF8000007FFC00000FFF800000FFFC00000FFF800000FFFC00000 -FFF800000FFFC00000FFF800001FFFC00000FFF800001FFFC000007FF800003FFFC00000 -7FF800003BFFC000007FF800007BFFC000003FFC0000F3FFC000003FFC0001E3FFF00000 -1FFE0007C3FFFFC0000FFFC03F83FFFFC00007FFFFFF03FFFFC00001FFFFFE03FFFFC000 -007FFFF803FFFFC0000007FFE003FF000042377BB54B>III<7FFFFFF0007FFFFE007FFFFFF0007FFFFE007FFFFFF0007FFFFE007FFFFFF0007FFF -FE007FFFFFF0007FFFFE00007FFE00000FFF0000003FFF000007F80000001FFF800007F0 -0000000FFFC0000FE000000007FFC0001FC000000007FFE0003F8000000003FFF0003F00 -00000001FFF8007E0000000000FFFC00FC00000000007FFE01FC00000000007FFE03F800 -000000003FFF07F000000000001FFF8FE000000000000FFFCFC0000000000007FFFF8000 -0000000003FFFF00000000000003FFFF00000000000001FFFE00000000000000FFFC0000 -00000000007FFE000000000000003FFF000000000000003FFF000000000000001FFF8000 -00000000001FFFC00000000000003FFFE00000000000007FFFF0000000000000FFFFF000 -0000000001FDFFF8000000000001F8FFFC000000000003F07FFE000000000007E03FFF00 -000000000FE01FFF00000000001FC01FFF80000000003F800FFFC0000000007F0007FFE0 -00000000FE0003FFF000000000FC0001FFF800000001F80001FFF800000003F00000FFFC -00000007F000007FFE0000000FE000003FFF0000001FC000001FFF800000FFF000001FFF -8000FFFFFE0001FFFFFFC0FFFFFE0001FFFFFFC0FFFFFE0001FFFFFFC0FFFFFE0001FFFF -FFC0FFFFFE0001FFFFFFC042357EB447>II -E /Fr 42 127 df<00000FF8000000007FFE00000001F80780000007E001C000001F8000 -E000003F0007E000007E000FF000007E000FF00000FC000FF00000FC000FF00001F8000F -F00001F80007E00001F80001800001F80000000001F80000000001F80000000001F80000 -000001F80000000001F80000000001F80000000001F80000000001F80000000001F80003 -F000FFFFFFFFF000FFFFFFFFF000FFFFFFFFF00001F8000FF00001F80003F00001F80003 -F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 -F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 -F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 -F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 -F00001F80003F00001F80003F00003FC0007F8007FFFE0FFFFC07FFFE0FFFFC07FFFE0FF -FFC02A3B7FBA2E>12 D<03F000FFF000FFF000FFF00007F00003F00003F00003F00003F0 -0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 -0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 -0007F800FFFFC0FFFFC0FFFFC012257EA417>16 D<003C007E007E00FE01FE03FC03F007 -E00FC01F801E003C007800F000C0000F0F6FB92A>19 D<03F00003F00003F00003FE0000 -3F80001FC0000FE00007E00007E00007E0000FE0001FC000FF80FFFE00FFE000130F757D -25>24 D<0000600000E00001C0000380000700000E00001E00003C0000780000780000F0 -0001E00001E00003C00003C00007C0000780000F80000F00000F00001F00001E00001E00 -003E00003E00003E00007C00007C00007C00007C00007C00007C0000F80000F80000F800 -00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F800 -00F80000F80000F800007C00007C00007C00007C00007C00007C00003E00003E00003E00 -001E00001E00001F00000F00000F00000F800007800007C00003C00003C00001E00001E0 -0000F000007800007800003C00001E00000E000007000003800001C00000E00000601352 -78BD20>40 DI<1C007F00FF80FF80FF80FF80FF807F001C000909798817>46 -D<000FF00000007FFE000001FFFF800003E03FE0000F000FF0000E0007F8001C0003FC00 -380001FE00300001FE00700000FF00600000FF00FC0000FF00FF00007F80FF80007F80FF -80007F80FF80007F80FF80007F80FF80007F807F00007F801C00007F800000007F800000 -00FF00000000FF00000000FF00000001FE00000001FC00000003FC00000003F800000007 -F000000007E00000000FE00000001FC00000003F800000003F000000007C00000000F800 -000001F000000003E000000007C00000000F800000000F000000001E000180003C000180 -007800018000F000038001E000030003C000030007800003000E000007000FFFFFFF001F -FFFFFF003FFFFFFF007FFFFFFE00FFFFFFFE00FFFFFFFE00FFFFFFFE0021387CB72A>50 -D<0600000C000780003C0007F003F80007FFFFF80007FFFFF00007FFFFE00007FFFF8000 -07FFFF000007FFFC0000067FE00000060000000006000000000600000000060000000006 -000000000600000000060000000006000000000600000000060000000006000000000607 -F80000063FFE000006780F800007E007E000078003F000070001F800060001F800060000 -FC00000000FE00000000FE00000000FF000000007F000000007F000000007F800000007F -800000007F800000007F803E00007F807F00007F80FF80007F80FF80007F80FF80007F80 -FF80007F80FF00007F00FE0000FF00E00000FF00600000FE00700000FE00300001FC0038 -0001F8001C0003F8001E0007F0000F800FE00007E03F800001FFFF0000007FFC0000001F -E00000213A7CB72A>53 D<0000003800000000000038000000000000380000000000007C -0000000000007C0000000000007C000000000000FE000000000000FE000000000000FE00 -0000000001FF000000000001FF000000000001FF0000000000037F8000000000037F8000 -000000077FC000000000063FC000000000063FC0000000000E3FE0000000000C1FE00000 -00000C1FE0000000001C1FF000000000180FF000000000180FF000000000380FF8000000 -003007F8000000003007F8000000007007FC000000006003FC000000006003FC00000000 -C003FE00000000C001FE00000000C001FE000000018001FF000000018000FF0000000180 -00FF000000030000FF8000000300007F8000000300007F8000000600007FC0000007FFFF -FFC0000007FFFFFFC000000FFFFFFFE000000C00001FE000000C00001FE000001800000F -F000001800000FF000001800000FF0000030000007F8000030000007F8000030000007F8 -000060000003FC000060000003FC0000E0000003FC0000E0000001FE0001E0000001FE00 -03F0000001FF000FFC000007FF80FFFF8000FFFFFEFFFF8000FFFFFEFFFF8000FFFFFE37 -3C7DBB3E>65 D<000001FF80018000000FFFE0038000007FFFF803800001FF807E078000 -03FC000F0F80000FF000039F80001FE00001DF80003F800000FF80007F0000007F8000FE -0000003F8001FE0000003F8003FC0000001F8007F80000000F8007F80000000F800FF000 -000007800FF000000007801FE000000007801FE000000003803FE000000003803FC00000 -0003807FC000000001807FC000000001807FC000000001807F800000000180FF80000000 -0000FF800000000000FF800000000000FF800000000000FF800000000000FF8000000000 -00FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000 -FF800000000000FF8000000000007F8000000000007FC000000001807FC000000001807F -C000000001803FC000000001803FE000000001801FE000000003801FE000000003000FF0 -00000003000FF0000000070007F8000000070007F8000000060003FC0000000E0001FE00 -00001C0000FE0000001800007F0000003800003F8000007000001FE00000E000000FF000 -03C0000003FC000F80000001FF803F000000007FFFFC000000000FFFF00000000001FF80 -0000313D7BBA3C>67 D69 D73 D76 -D<000003FF00000000001FFFE000000000FE01FC00000001F8007E00000007E0001F8000 -000FC0000FC000003F800007F000007F000003F80000FE000001FC0001FC000000FE0001 -F80000007E0003F80000007F0007F00000003F8007F00000003F800FE00000001FC00FE0 -0000001FC01FE00000001FE01FC00000000FE03FC00000000FF03FC00000000FF03FC000 -00000FF07FC00000000FF87F8000000007F87F8000000007F87F8000000007F8FF800000 -0007FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FCFF80000000 -07FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007 -FCFF8000000007FC7F8000000007F87FC00000000FF87FC00000000FF87FC00000000FF8 -3FC00000000FF03FC00000000FF01FE00000001FE01FE00000001FE01FE00000001FE00F -F00000003FC007F00000003F8007F80000007F8003F80000007F0001FC000000FE0001FC -000000FE0000FE000001FC00007F000003F800003F800007F000001FC0000FE0000007E0 -001F80000003F8007F00000000FE01FC000000001FFFE00000000003FF000000363D7BBA -41>79 DI<3FFFFFFFFFFFE0 -3FFFFFFFFFFFE03FFFFFFFFFFFE03FC003FF001FE03E0001FE0003E07C0001FE0001F078 -0001FE0000F0700001FE000070700001FE000070700001FE000070600001FE0000306000 -01FE000030600001FE000030600001FE000030E00001FE000038C00001FE000018C00001 -FE000018C00001FE000018C00001FE000018000001FE000000000001FE000000000001FE -000000000001FE000000000001FE000000000001FE000000000001FE000000000001FE00 -0000000001FE000000000001FE000000000001FE000000000001FE000000000001FE0000 -00000001FE000000000001FE000000000001FE000000000001FE000000000001FE000000 -000001FE000000000001FE000000000001FE000000000001FE000000000001FE00000000 -0001FE000000000001FE000000000001FE000000000001FE000000000001FE0000000000 -01FE000000000001FE000000000001FE000000000001FE000000000001FE000000000001 -FE000000000007FF800000001FFFFFFFE000001FFFFFFFE000001FFFFFFFE00035397DB8 -3C>84 D<001FE0000000FFFC000003E03F000007000F80000F8007E0001FC003F0001FE0 -03F0001FE001F8001FE001F8001FE000FC000FC000FC00078000FC00000000FC00000000 -FC00000000FC00000000FC0000007FFC000007FFFC00003FE0FC0000FE00FC0003F800FC -000FF000FC001FC000FC003FC000FC007F8000FC007F0000FC007F0000FC0CFE0000FC0C -FE0000FC0CFE0000FC0CFE0001FC0CFE0001FC0CFF0003FC0C7F00077C0C7F80063E183F -C01E3E180FE0781FF003FFF00FE0007F8007C026277DA52A>97 D<03F0000000FFF00000 -00FFF0000000FFF00000000FF000000003F000000003F000000003F000000003F0000000 -03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 -F000000003F000000003F000000003F000000003F000000003F01FE00003F07FF80003F1 -E03E0003F3801F8003F7000FC003FE0007E003FC0003F003F80001F803F00001F803F000 -00FC03F00000FC03F00000FE03F00000FE03F000007E03F000007F03F000007F03F00000 -7F03F000007F03F000007F03F000007F03F000007F03F000007F03F000007F03F000007F -03F000007E03F00000FE03F00000FE03F00000FC03F00001FC03F80001F803F80003F003 -FC0003F003EE0007E003C6000FC003C7801F000381E07E000300FFF80000001FC000283B -7EB92E>I<0003FC00001FFF80007E03E001F8007003F000F807E001FC0FC003FC0FC003 -FC1F8003FC3F8003FC3F0001F87F0000F07F0000007F0000007E000000FE000000FE0000 -00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000007E0000 -007F0000007F0000003F0000063F8000061F80000E1FC0000C0FC0001C07E0003803F000 -7001F800E0007C07C0001FFF000007F8001F277DA525>I<0000000FC0000003FFC00000 -03FFC0000003FFC00000003FC00000000FC00000000FC00000000FC00000000FC0000000 -0FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000F -C00000000FC00000000FC00000000FC00000000FC00003F80FC0001FFF0FC0007E078FC0 -00F801EFC003F0007FC007E0003FC00FC0001FC00FC0001FC01F80000FC03F80000FC03F -00000FC07F00000FC07F00000FC07E00000FC0FE00000FC0FE00000FC0FE00000FC0FE00 -000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC07E0000 -0FC07F00000FC07F00000FC03F00000FC03F00000FC01F80001FC01F80001FC00FC0003F -C007E0007FC003F000EFF001F801CFFF007C078FFF001FFE0FFF0007F80FC0283B7DB92E ->I<0007F800001FFF00007C0FC001F803E003F001F007E001F80FC000F81F80007C1F80 -007C3F00007E3F00003E7F00003E7F00003F7E00003FFE00003FFE00003FFE00003FFFFF -FFFFFFFFFFFFFE000000FE000000FE000000FE000000FE0000007E0000007E0000007F00 -00007F0000003F0000033F8000031F8000070FC0000607C0000E07E0001C01F0003800F8 -0070007E03E0001FFF800003FC0020277EA525>I<00007E000003FF80000FC1E0001F87 -E0003F0FF0007E0FF0007E0FF000FC0FF000FC0FF001F803C001F8000001F8000001F800 -0001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800 -0001F80000FFFFFC00FFFFFC00FFFFFC0001F8000001F8000001F8000001F8000001F800 -0001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800 -0001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800 -0001F8000001F8000001F8000001F8000001F8000001F8000003FC00007FFFF8007FFFF8 -007FFFF8001C3B7FBA19>I<00000003F0000FF00FF8003FFC3C3C00F81F707C01F00FE0 -7C03E007C07C07C003E0100FC003F0000FC003F0001F8001F8001F8001F8001F8001F800 -1F8001F8001F8001F8001F8001F8001F8001F8001F8001F8000FC003F0000FC003F00007 -C003E00003E007C00003F00F800003F81F0000073FFC0000060FF000000E000000000E00 -0000000E000000000E000000000F000000000F000000000FC000000007FFFFC00007FFFF -F80003FFFFFE0001FFFFFF8003FFFFFFC00F80007FE01F00000FF03E000003F07C000001 -F07C000001F8F8000000F8F8000000F8F8000000F8F8000000F8F8000000F8FC000001F8 -7C000001F03E000003E03F000007E00F80000F8007E0003F0001FC01FC00007FFFF00000 -07FF000026387EA52A>I<03F000000000FFF000000000FFF000000000FFF0000000000F -F00000000003F00000000003F00000000003F00000000003F00000000003F00000000003 -F00000000003F00000000003F00000000003F00000000003F00000000003F00000000003 -F00000000003F00000000003F00000000003F00000000003F00000000003F00FF0000003 -F03FFC000003F0F03F000003F1C01F800003F3800FC00003F7000FC00003FE000FC00003 -FC0007E00003FC0007E00003F80007E00003F80007E00003F80007E00003F00007E00003 -F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 -F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 -F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 -F00007E00003F00007E00007F8000FF000FFFFC1FFFF80FFFFC1FFFF80FFFFC1FFFF8029 -3A7EB92E>I<0380000FE0001FF0001FF0001FF0001FF0001FF0000FE000038000000000 -00000000000000000000000000000000000000000000000000000003F000FFF000FFF000 -FFF00007F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F000 -03F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F000 -03F00003F00003F00003F00003F00003F00007F800FFFFC0FFFFC0FFFFC012387EB717> -I<0001C00007F0000FF8000FF8000FF8000FF8000FF80007F00001C00000000000000000 -000000000000000000000000000000000000000000000001F800FFF800FFF800FFF80007 -F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 -F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 -F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 -F80001F80001F83C01F87E01F8FF01F0FF03F0FF03F0FF03E0FE07C07C07C03C0F000FFE -0003F800154984B719>I<03F000FFF000FFF000FFF0000FF00003F00003F00003F00003 -F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003 -F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003 -F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003 -F00003F00003F00003F00003F00003F00003F00003F00003F00003F00007F800FFFFC0FF -FFC0FFFFC0123A7EB917>108 D<03F00FF0001FE000FFF03FFC007FF800FFF0F03F01E0 -7E00FFF1C01F83803F000FF3800FC7001F8003F7000FCE001F8003FE000FDC001F8003FC -0007F8000FC003FC0007F8000FC003F80007F0000FC003F80007F0000FC003F80007F000 -0FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F0 -0007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E000 -0FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F0 -0007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E000 -0FC003F00007E0000FC003F00007E0000FC003F00007E0000FC007F8000FF0001FE0FFFF -C1FFFF83FFFFFFFFC1FFFF83FFFFFFFFC1FFFF83FFFF40257EA445>I<03F00FF00000FF -F03FFC0000FFF0F03F0000FFF1C01F80000FF3800FC00003F7000FC00003FE000FC00003 -FC0007E00003FC0007E00003F80007E00003F80007E00003F80007E00003F00007E00003 -F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 -F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 -F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 -F00007E00003F00007E00007F8000FF000FFFFC1FFFF80FFFFC1FFFF80FFFFC1FFFF8029 -257EA42E>I<0003FE0000000FFF8000003E03E00000F800F80001F0007C0003E0003E00 -07C0001F000F80000F801F80000FC01F000007C03F000007E03F000007E07E000003F07E -000003F07E000003F07E000003F0FE000003F8FE000003F8FE000003F8FE000003F8FE00 -0003F8FE000003F8FE000003F8FE000003F8FE000003F87E000003F07E000003F07F0000 -07F03F000007E03F000007E01F80000FC00F80000F800FC0001F8007E0003F0003F0007E -0000F800F800007E03F000001FFFC0000003FE000025277EA52A>I<03F01FE000FFF07F -F800FFF1E07E00FFF3801F8007F7000FC003FE0007E003FC0003F003F80003F803F00001 -F803F00001FC03F00000FC03F00000FE03F00000FE03F00000FE03F000007F03F000007F -03F000007F03F000007F03F000007F03F000007F03F000007F03F000007F03F000007F03 -F000007F03F00000FE03F00000FE03F00000FE03F00001FC03F00001FC03F80003F803F8 -0003F003FC0007F003FE000FE003F6000FC003F7803F0003F1E07E0003F0FFF80003F01F -C00003F000000003F000000003F000000003F000000003F000000003F000000003F00000 -0003F000000003F000000003F000000003F000000007F8000000FFFFC00000FFFFC00000 -FFFFC0000028357EA42E>I<0003F800C0001FFE01C0007E0781C000FC01C3C003F000E3 -C007F00077C00FE00037C00FC0003FC01FC0001FC03F80001FC03F80000FC07F00000FC0 -7F00000FC07F00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE -00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC07F00000FC07F00000FC07F00 -000FC03F00000FC03F80001FC01F80001FC01FC0003FC00FC0003FC007E0007FC003F000 -EFC001F801CFC0007E078FC0001FFE0FC00007F80FC00000000FC00000000FC00000000F -C00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC0 -0000000FC00000001FE0000003FFFF000003FFFF000003FFFF28357DA42C>I<07E01F00 -FFE07FC0FFE1E3E0FFE387F00FE707F003E607F003EE07F003EC03E003FC008003F80000 -03F8000003F8000003F8000003F0000003F0000003F0000003F0000003F0000003F00000 -03F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000 -03F0000003F0000003F0000003F0000003F0000007F80000FFFFF000FFFFF000FFFFF000 -1C257EA421>I<00FF030003FFE7000F80FF001E003F003C001F0078000F0070000700F0 -000700F0000700F0000300F8000300F8000300FC000300FF0000007FE000007FFF00003F -FFE0001FFFF8000FFFFC0003FFFE0000FFFF000007FF8000007F8000001F80C0000FC0C0 -0007C0C00007C0E00003C0E00003C0E00003C0F00003C0F0000380F8000780FC000780FC -000F00FF001E00F3C07C00E1FFF000C03F80001A277DA521>I<00180000001800000018 -0000001800000018000000380000003800000038000000780000007800000078000000F8 -000001F8000003F8000007F800001FFFFF00FFFFFF00FFFFFF0001F8000001F8000001F8 -000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8 -000001F8000001F8000001F8000001F8000001F8000001F8000001F800C001F800C001F8 -00C001F800C001F800C001F800C001F800C001F800C001F800C000FC01C000FC0180007C -0380007E0300003F0700000FFE000001F8001A347FB220>I<03F00007E000FFF001FFE0 -00FFF001FFE000FFF001FFE0000FF0001FE00003F00007E00003F00007E00003F00007E0 -0003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E0 -0003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E0 -0003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E0 -0003F00007E00003F0000FE00003F0000FE00003F0000FE00003F0001FE00001F0001FE0 -0001F8003FE00000F80077F80000FC00E7FF80003F03C7FF80001FFF87FF800003FC07E0 -0029267EA42E>IIIII<01E0004007F800E00FFE01 -C01FFF87803C3FFF00700FFE00E003FC004000F0001B0879B62A>126 -D E /Fs 13 118 df<000F00003F80003FC0007FE000FFE001FFE003FFE007FFE007FFC0 -0FFF801FFE003FF8007FE000FF80007E000038000013106DBA30>19 -D<00000003E00000000000000007F00000000000000007F0000000000000000FF8000000 -000000000FF8000000000000000FF8000000000000001FFC000000000000001FFC000000 -000000003FFE000000000000003FFE000000000000003FFE000000000000007FFF000000 -000000007FFF00000000000000FFFF80000000000000FFFF80000000000000FFFF800000 -00000001FFFFC0000000000001F3FFC0000000000003F3FFE0000000000003E1FFE00000 -00000003E1FFE0000000000007E1FFF0000000000007C0FFF000000000000FC0FFF80000 -0000000F807FF800000000000F807FF800000000001F807FFC00000000001F003FFC0000 -0000003F003FFE00000000003E001FFE00000000003E001FFE00000000007E001FFF0000 -0000007C000FFF0000000000FC000FFF8000000000F80007FF8000000000F80007FF8000 -000001F80007FFC000000001F00003FFC000000003FFFFFFFFE000000003FFFFFFFFE000 -000003FFFFFFFFE000000007FFFFFFFFF000000007C00000FFF00000000FC00000FFF800 -00000F8000007FF80000000F8000007FF80000001F8000007FFC0000001F0000003FFC00 -00003F0000003FFE0000003E0000001FFE0000003E0000001FFE0000007E0000001FFF00 -00007C0000000FFF000000FE0000000FFF8000FFFFF80007FFFFFF80FFFFF80007FFFFFF -80FFFFF80007FFFFFF80FFFFF80007FFFFFF80413A7DB948>65 D<0007FF000E00003FFF -E01E0000FFFFF83E0003FFFFFE7E0007FC01FFFE000FF0001FFE001FE0000FFE003FC000 -03FE003F800001FE007F800000FE007F000000FE007F0000007E00FF0000007E00FF0000 -003E00FF0000003E00FF8000003E00FF8000001E00FFC000001E00FFE000001E00FFF000 -000000FFFC000000007FFFE00000007FFFFE0000007FFFFFF000003FFFFFFE00003FFFFF -FF80001FFFFFFFC0000FFFFFFFF00007FFFFFFF80003FFFFFFFC0000FFFFFFFE00003FFF -FFFE00000FFFFFFF000001FFFFFF0000000FFFFF800000007FFF800000000FFFC0000000 -03FFC000000001FFC000000000FFC0F00000007FC0F00000007FC0F00000007FC0F00000 -003FC0F00000003FC0F80000003FC0F80000003F80FC0000003F80FC0000007F80FE0000 -007F00FF0000007F00FF800000FE00FFE00001FC00FFF80003FC00FFFF801FF800FCFFFF -FFE000F83FFFFFC000F007FFFE0000E0007FF000002A3B7BB935>83 -D<003FFE00000003FFFFE000000FFFFFF800001FF00FFE00003FF003FF00003FF801FF80 -003FF800FFC0003FF800FFC0003FF8007FE0003FF8007FE0001FF0007FE0000FE0007FE0 -000380007FE0000000007FE0000000007FE00000003FFFE000000FFFFFE000007FFFFFE0 -0001FFF87FE00007FF807FE0000FFE007FE0003FF8007FE0003FF0007FE0007FE0007FE0 -00FFE0007FE000FFC0007FE000FFC0007FE000FFC0007FE000FFC0007FE000FFC000FFE0 -00FFE001FFE0007FE001FFE0003FF007FFF8001FFC1FBFFFC00FFFFE1FFFC003FFF80FFF -C0003FE003FFC02A257DA42E>97 D<00FF00000000FFFF00000000FFFF00000000FFFF00 -000000FFFF0000000007FF0000000003FF0000000003FF0000000003FF0000000003FF00 -00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00 -00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF01 -FF800003FF0FFFF00003FF3FFFFC0003FFFE03FF0003FFF000FF8003FFE0007FC003FF80 -003FE003FF00003FF003FF00001FF803FF00001FF803FF00001FFC03FF00000FFC03FF00 -000FFC03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00 -000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFC03FF00 -000FFC03FF00000FFC03FF00001FF803FF00001FF803FF00001FF003FF80003FF003FFC0 -007FE003FFE0007FC003FDF001FF8003F8FC07FE0003F03FFFF80003E00FFFE00003C003 -FF00002F3A7EB935>I<0001FFC000000FFFFC00007FFFFF0000FF80FF8003FE00FFC007 -FC01FFC00FF801FFC01FF801FFC01FF001FFC03FF001FFC03FF000FF807FE0007F007FE0 -001C007FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 -0000FFE0000000FFE0000000FFE00000007FE00000007FE00000007FF00000003FF00000 -003FF00001E01FF80001E01FF80003E00FFC0007C007FE00078003FF001F8000FFC07E00 -007FFFFC00000FFFF0000001FF800023257DA42A>I<01F00007FC000FFE000FFE001FFF -001FFF001FFF001FFF001FFF000FFE000FFE0007FC0001F0000000000000000000000000 -0000000000000000000000000000000000FF007FFF007FFF007FFF007FFF0007FF0003FF -0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF -0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF -0003FF0003FF00FFFFF8FFFFF8FFFFF8FFFFF8153B7DBA1B>105 -D<00FE007FE0000FFC0000FFFE01FFFC003FFF8000FFFE07FFFF00FFFFE000FFFE1F81FF -83F03FF000FFFE3C00FF87801FF00007FE7800FFCF001FF80003FEF000FFDE001FF80003 -FFE0007FFC000FFC0003FFC0007FF8000FFC0003FFC0007FF8000FFC0003FF80007FF000 -0FFC0003FF80007FF0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00 -007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC -0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007F -E0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003 -FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE000 -0FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00 -007FE0000FFC00FFFFFC1FFFFF83FFFFF0FFFFFC1FFFFF83FFFFF0FFFFFC1FFFFF83FFFF -F0FFFFFC1FFFFF83FFFFF04C257DA451>109 D<0001FFC00000000FFFF80000007FFFFF -000000FF80FF800003FE003FE00007FC001FF0000FF8000FF8001FF00007FC001FF00007 -FC003FF00007FE003FE00003FE007FE00003FF007FE00003FF007FE00003FF00FFE00003 -FF80FFE00003FF80FFE00003FF80FFE00003FF80FFE00003FF80FFE00003FF80FFE00003 -FF80FFE00003FF80FFE00003FF807FE00003FF007FE00003FF007FE00003FF003FE00003 -FE003FF00007FE001FF00007FC001FF00007FC000FF8000FF80007FC001FF00003FE003F -E00001FF80FFC000007FFFFF0000001FFFFC00000001FFC0000029257DA430>111 -D<00FE03F000FFFE0FFE00FFFE3FFF00FFFE7C7F80FFFEF8FFC007FEF0FFC003FFE0FFC0 -03FFC0FFC003FFC0FFC003FF807F8003FF803F0003FF800C0003FF80000003FF00000003 -FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF -00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00 -000003FF00000003FF00000003FF00000003FF000000FFFFFE0000FFFFFE0000FFFFFE00 -00FFFFFE000022257EA427>114 D<003FF03803FFFEF80FFFFFF81FC00FF83F0003F87E -0001F87C0000F8FC0000F8FC000078FE000078FF000078FF800000FFFC0000FFFFE0007F -FFFC007FFFFF803FFFFFC01FFFFFF00FFFFFF803FFFFF800FFFFFC001FFFFC00007FFE00 -0007FEF00001FEF00000FEF80000FEF800007EFC00007EFC00007CFE0000FCFF0000F8FF -8001F8FFF007F0FFFFFFC0F8FFFF00E01FF8001F257DA426>I<000F0000000F0000000F -0000000F0000000F0000001F0000001F0000001F0000001F0000003F0000003F0000007F -000000FF000000FF000001FF000007FF00001FFFFFE0FFFFFFE0FFFFFFE0FFFFFFE003FF -000003FF000003FF000003FF000003FF000003FF000003FF000003FF000003FF000003FF -000003FF000003FF000003FF000003FF000003FF000003FF000003FF000003FF000003FF -007803FF007803FF007803FF007803FF007803FF007803FF007803FF007803FF00F801FF -80F001FF81F000FFC3E0003FFFC0001FFF800003FE001D357EB425>I<00FF00003FC0FF -FF003FFFC0FFFF003FFFC0FFFF003FFFC0FFFF003FFFC007FF0001FFC003FF0000FFC003 -FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003 -FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003 -FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003 -FF0000FFC003FF0000FFC003FF0001FFC003FF0001FFC003FF0003FFC003FF0003FFC001 -FF0007FFC001FF800FFFE000FFC03EFFFF007FFFFCFFFF001FFFF0FFFF0003FF80FFFF30 -257DA435>I E /Ft 7 115 df<0000003FFE0000000003FFFFF00000000FFFFFFE000000 -3FFFFFFF800000FFFFFFFF800001FFFFFFFF800003FFE007FF00000FFF0000FF00001FFC -00001F00003FF800000700007FE000000300007FC00000000000FF800000000001FF0000 -00000003FF000000000003FE000000000007FC000000000007FC00000000000FF8000000 -00000FF800000000001FF000000000001FF000000000003FE000000000003FE000000000 -003FE000000000007FC000000000007FC000000000007FC000000000007FC00000000000 -7FC00000000000FF800000000000FF800000000000FF800000000000FF800000000000FF -800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF80 -0000000000FF800000000000FF800000000000FF8000000000007FC000000000007FC000 -000000007FC000000000007FC000000000007FC000000000003FE000000000003FE00000 -0000003FE000000000001FF000000000001FF000000000000FF800000000000FF8000000 -000007FC000000000007FC000000000003FE000000000003FF000000000001FF00000000 -0000FF8000000080007FC000000180007FE000000380003FF800000F80001FFC00001FC0 -000FFF00007FC00003FFE003FFC00001FFFFFFFF800000FFFFFFFE0000003FFFFFFC0000 -000FFFFFF000000003FFFFC0000000003FFC000032497AC63E>67 -D<0000003FFC0000000001FFFFE00000000FFFFFF80000003FFFFFFF000000FFFFFFFFC0 -0001FFFFFFFFE00003FFE007FFE00007FF00007FE0001FFC00001FC0003FF8000007C000 -3FF0000003C0007FC0000001C000FF80000000C001FF800000000003FF000000000003FE -000000000007FC000000000007FC00000000000FF800000000000FF800000000001FF000 -000000001FF000000000003FE000000000003FE000000000003FE000000000007FC00000 -0000007FC000000000007FC000000000007FC000000000007FC00000000000FF80000000 -0000FF800000000000FF800000000000FF800000000000FF800000000000FF8000000000 -00FF800000000000FF800000000000FF800000000000FF800000000000FF800001FFFFF0 -FF800001FFFFF0FF800001FFFFF07FC00001FFFFF07FC00001FFFFF07FC00001FFFFF07F -C00000000FF07FC00000000FF03FE00000000FF03FE00000000FF03FE00000000FF01FF0 -0000000FF01FF00000000FF00FF80000000FF00FF80000000FF007FC0000000FF007FC00 -00000FF003FE0000000FF003FF0000000FF001FF8000000FF000FF8000000FF0007FC000 -000FF0003FF000000FF0003FF800000FF0001FFC00000FF00007FF00003FF00003FFE007 -FFF00001FFFFFFFFF00000FFFFFFFFE000003FFFFFFF0000000FFFFFFC00000001FFFFE0 -000000003FFC000034497AC641>71 D84 -D<0007FE0000007FFFC00003FFFFE0000FFFFFF8001FFFFFFC001FFFFFFE001FF803FF00 -1F8001FF001E0000FF801800007F801000003FC00000003FC00000003FE00000001FE000 -00001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000 -7FFFE0000FFFFFE0003FFFFFE001FFFFFFE003FFFFFFE00FFFF01FE01FFE001FE03FF800 -1FE07FE0001FE07FC0001FE0FF80001FE0FF00001FE0FF00001FE0FF00001FE0FF00001F -E0FF00003FE0FF80003FE07FC0007FE07FE001FFE07FF80FFFE03FFFFFFFE01FFFFFFFE0 -1FFFFFDFE00FFFFF1FE003FFF81FE000FF800000232F7CAD2F>97 -D<0001FE00000007FFC000001FFFF000007FFFF80000FFFFFC0001FFFFFE0003FF03FF00 -07FC00FF000FF8007F800FF0003F801FE0001FC01FE0000FC03FC0000FE03F800007E07F -800007E07F800007E07F000007E07F000003F0FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0FFFF -FFFFF0FFFFFFFFF0FFFFFFFFF0FE00000000FE00000000FE00000000FF00000000FF0000 -00007F000000007F000000007F800000003F800000003FC00000003FC00000001FE00000 -001FF00000100FF800007007FC0001F003FE0007F003FF803FF001FFFFFFF000FFFFFFE0 -003FFFFF80001FFFFE000007FFF8000000FFC000242F7DAD2B>101 -D<00001FF00000FFFE0001FFFE0007FFFE000FFFFE001FFFFE003FF01E003FC002007F80 -00007F000000FE000000FE000001FE000001FE000001FE000001FE000001FE000001FE00 -0001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE0000FFFFFF -80FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8001FE000001FE000001FE000001FE00 -0001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE00 -0001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE00 -0001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE00 -0001FE000001FE000001FE000001FE000001FE000001FE000001FE00001F467EC51E>I< -00001FFE00FFFE03FFFE07FFFE1FFFFE3FFFFE7FFFFEFFF0FEFF80FFFE00FFFC00FFF800 -FFF000FFE000FFC000FFC000FF8000FF8000FF8000FF0000FF0000FF0000FF0000FF0000 -FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 -FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000182D79AC21>114 -D E /Fu 25 118 df<7FFFFFFF00FFFFFFFF80FFFFFFFF80FFFFFFFF80FFFFFFFF807FFF -FFFF0021067B9B2C>45 D<1F003F807FC0FFE0FFE0FFE0FFE0FFE07FC03F801F000B0B70 -8A2C>I<00000007000000000F800000001F800000001F800000003F800000003F000000 -007F000000007E00000000FE00000000FC00000001FC00000001F800000003F800000003 -F000000003F000000007F000000007E00000000FE00000000FC00000001FC00000001F80 -0000003F800000003F000000007F000000007E00000000FE00000000FC00000000FC0000 -0001FC00000001F800000003F800000003F000000007F000000007E00000000FE0000000 -0FC00000001FC00000001F800000001F800000003F800000003F000000007F000000007E -00000000FE00000000FC00000001FC00000001F800000003F800000003F000000007F000 -000007E000000007E00000000FE00000000FC00000001FC00000001F800000003F800000 -003F000000007F000000007E00000000FE00000000FC00000000FC00000000F800000000 -780000000021417BB92C>I<00070000000F8000000F8000001F8000001F8000003F8000 -007F800000FF800001FF800007FF80007FFF8000FFFF8000FFDF8000FF9F80007C1F8000 -001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000 -001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000 -001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000 -001F8000001F8000001F8000001F8000001F80007FFFFFE0FFFFFFF0FFFFFFF0FFFFFFF0 -7FFFFFE01C3477B32C>49 D<000FF80000007FFF800001FFFFE00007FFFFF0000FFFFFFC -001FF80FFE003FE001FF003F80007F007F00003F807E00001F80FE00001FC0FE00000FC0 -FF00000FE0FF000007E0FF000007E0FF000007E07E000007E03C000007E000000007E000 -000007E00000000FE00000000FC00000001FC00000001F800000003F800000003F000000 -007F00000000FE00000001FC00000003FC00000007F80000000FF00000001FE00000003F -C0000000FF80000001FE00000003FC00000007F80000000FF00000003FE00000007F8000 -0000FF00000001FE00000003FC0003C007F80007E01FE00007E03FC00007E07FFFFFFFE0 -FFFFFFFFE0FFFFFFFFE0FFFFFFFFE07FFFFFFFC023347CB32C>I<000007F00000000FF8 -0000001FF80000003FF80000003FF80000007EF80000007EF8000000FCF8000001F8F800 -0001F8F8000003F0F8000007E0F8000007E0F800000FC0F800001F80F800001F80F80000 -3F00F800007E00F800007E00F80000FC00F80001F800F80001F800F80003F000F80003E0 -00F80007E000F8000FC000F8000FC000F8001F8000F8003F0000F8003F0000F8007E0000 -F800FC0000F800FFFFFFFFFCFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE7FFFFFFFFC000000F8 -00000000F800000000F800000000F800000000F800000000F800000000F800000000F800 -000000F800000000F80000007FFFF00000FFFFF80000FFFFF80000FFFFF800007FFFF027 -347EB32C>52 D<00003FC0000001FFF8000007FFFC00001FFFFE00003FFFFF00007FE07F -0000FF003F8001FE007F8003F8007F8007F0007F8007E0007F800FE0003F001FC0001E00 -1F800000003F800000003F000000003F000000007F000000007E000000007E03FE00007E -1FFF8000FC7FFFE000FDFFFFF000FFFFFFF800FFFE07FC00FFF001FE00FFC0007F00FF80 -003F80FF00001F80FF00001FC0FE00000FC0FE00000FE0FE000007E0FE000007E0FE0000 -07E07E000007E07E000007E07E000007E07E000007E03F000007E03F00000FE03F80000F -C01F80001FC01FC0001F800FC0003F800FE0007F0007F801FE0003FE07FC0001FFFFF800 -00FFFFF000007FFFE000001FFF80000007FC000023357CB32C>54 -D<7800000000FFFFFFFFC0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFC0FC00003F80 -FC00007F00FC0000FE00780000FC00000001FC00000003F800000007F000000007E00000 -000FE00000000FC00000001F800000003F800000003F000000007F000000007E00000000 -FE00000000FC00000001FC00000001F800000001F800000003F000000003F000000007F0 -00000007E000000007E000000007E00000000FC00000000FC00000000FC00000000FC000 -00001F800000001F800000001F800000001F800000001F800000003F800000003F000000 -003F000000003F000000003F000000003F000000003F000000003F000000003F00000000 -3F000000003F000000001E00000023357CB32C>I<0007FC0000003FFF800000FFFFE000 -03FFFFF80007FFFFFC000FFC07FE001FF001FF001FC0007F003F80003F803F00001F807F -00001FC07E00000FC07E00000FC07E00000FC07E00000FC07E00000FC03F00001F803F00 -001F801F80003F001FC0007F000FF001FE0003FC07F80001FFFFF000007FFFC0000007FC -0000007FFFC00001FFFFF00003FC07F8000FF001FE001FC0007F001F80003F003F00001F -807E00000FC07E00000FC0FC000007E0FC000007E0FC000007E0FC000007E0FC000007E0 -FC000007E0FC000007E07E00000FC07E00000FC07F00001FC03F80003F801FC0007F001F -F001FF000FFC07FE0007FFFFFC0003FFFFF80000FFFFE000003FFF80000007FC00002335 -7CB32C>I<0007FC0000003FFF000000FFFFC00001FFFFE00003FFFFF00007FC07F8000F -F001FC001FE000FE003F80007E003F80007F007F00003F007E00001F80FE00001F80FC00 -001F80FC00000FC0FC00000FC0FC00000FC0FC00000FC0FC00000FE0FC00000FE0FC0000 -0FE0FE00000FE07E00000FE07F00001FE03F00001FE03F80003FE01FC0007FE00FF001FF -E007FC0FFFE003FFFFFFE001FFFFF7E000FFFFC7E0003FFF0FE0000FF80FC00000000FC0 -0000000FC00000001FC00000001F800000003F800000003F000F00007F001F80007E003F -C000FE003FC001FC003FC003F8003FC007F8003F801FF0001FE07FE0001FFFFFC0000FFF -FF000007FFFE000001FFF80000007FC0000023357CB32C>I<1F003F807FC0FFE0FFE0FF -E0FFE0FFE07FC03F801F0000000000000000000000000000000000000000000000000000 -0000001F003F807FC0FFE0FFE0FFE0FFE0FFE07FC03F801F000B2470A32C>I<00007F80 -000003FFE000000FFFF000003FFFF800007FFFFC0000FFC0FE0001FE007F0003F8003F00 -07F0001F8007E00FCF800FC03FFF801F807FFFC01F80FFFFC03F01FFFFC03E03F87FC03E -07F03FE07E07E01FE07C0FC00FE07C0F8007E07C0F8007E0FC1F8007E0F81F0003E0F81F -0003E0F81F0003E0F81F0003E0F81F0003E0F81F0003E0F81F0003E0F81F0003E0F81F00 -03E0FC1F8007E07C0F8007C07C0F8007C07C0FC00FC07E07E01F803E07F03F803E03F87F -003F01FFFE001F80FFFC001F807FF8000FC03FF00007E00FC00007F00007C003F8000FE0 -01FE001FE000FFC0FFE0007FFFFFC0003FFFFF80000FFFFE000003FFF80000007FC00023 -337CB22C>64 D<7FFFFF0000FFFFFFC000FFFFFFF000FFFFFFF8007FFFFFFC0007E003FE -0007E000FF0007E0007F8007E0003F8007E0001FC007E0000FE007E0000FE007E00007E0 -07E00007F007E00003F007E00003F807E00001F807E00001F807E00001F807E00001F807 -E00000FC07E00000FC07E00000FC07E00000FC07E00000FC07E00000FC07E00000FC07E0 -0000FC07E00000FC07E00000FC07E00000FC07E00000FC07E00001F807E00001F807E000 -01F807E00003F807E00003F007E00003F007E00007F007E00007E007E0000FE007E0001F -C007E0003FC007E0007F8007E000FF0007E003FE007FFFFFFC00FFFFFFF800FFFFFFF000 -FFFFFFC0007FFFFF000026337EB22C>68 D<01FFF0000007FFFE00001FFFFF80001FFFFF -E0003FFFFFF0003FC01FF8003FC007F8003FC001FC001F8000FC00060000FE000000007E -000000007E000000007E000000FFFE00001FFFFE0000FFFFFE0003FFFFFE000FFFFFFE00 -1FFF807E003FF8007E007FC0007E007F00007E00FE00007E00FC00007E00FC00007E00FC -00007E00FC00007E00FE00007E007F0000FE007F8003FE003FE01FFE001FFFFFFFFC0FFF -FFFFFE07FFFFBFFE01FFFE1FFE003FF007FC27247CA32C>97 D<7FF0000000FFF8000000 -FFF8000000FFF80000007FF800000001F800000001F800000001F800000001F800000001 -F800000001F800000001F800000001F800000001F800000001F800000001F81FE00001F8 -FFF80001FBFFFE0001FFFFFF0001FFFFFF8001FFF07FC001FF801FE001FF0007F001FE00 -03F801FC0003F801FC0001FC01F80000FC01F80000FC01F80000FE01F800007E01F80000 -7E01F800007E01F800007E01F800007E01F800007E01F800007E01F800007E01F80000FE -01FC0000FC01FC0000FC01FC0001F801FE0003F801FF0007F001FF000FF001FF801FE001 -FFE07FC001FFFFFF8001FFFFFF0001FBFFFE0001F8FFF80000F03FC00027337FB22C>I< -0003FFE000001FFFF800007FFFFE0001FFFFFE0003FFFFFF0007FE00FF000FF000FF001F -E000FF001FC0007E003F800018003F000000007F000000007E000000007E00000000FC00 -000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC0000 -00007E000000007E000000007F000000003F00000F003F80001F801FC0001F801FE0003F -800FF0007F0007FE03FF0003FFFFFE0001FFFFFC00007FFFF800001FFFE0000003FF0000 -21247AA32C>I<00000FFE0000001FFF0000001FFF0000001FFF0000000FFF000000003F -000000003F000000003F000000003F000000003F000000003F000000003F000000003F00 -0000003F000000003F000007F83F00003FFE3F0000FFFFBF0001FFFFFF0003FFFFFF0007 -FC0FFF000FF003FF001FE001FF001FC000FF003F80007F003F00007F007E00003F007E00 -003F00FE00003F00FC00003F00FC00003F00FC00003F00FC00003F00FC00003F00FC0000 -3F00FC00003F00FC00003F00FE00003F007E00007F007E00007F007F0000FF003F8000FF -003F8001FF001FC003FF000FF007FF0007FC1FFF0003FFFFFFFC01FFFFBFFE00FFFF3FFE -003FFC3FFE000FF01FFC27337DB22C>I<0003FE0000001FFFC000007FFFF00001FFFFF8 -0003FFFFFC0007FE03FE000FF800FF001FE0003F801FC0003F803F80001FC03F00000FC0 -7F00000FC07E00000FE07E000007E0FC000007E0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FF -FFFFFFE0FFFFFFFFC0FC00000000FE000000007E000000007E000000007F000000003F00 -0003C03F800007E01FC00007E00FF0000FE007F8003FC007FF00FFC001FFFFFF8000FFFF -FF00003FFFFC00000FFFF0000001FF800023247CA32C>I<00070000001FC000001FC000 -003FE000003FE000003FE000001FC000001FC00000070000000000000000000000000000 -000000000000000000000000000000007FFFC0007FFFE000FFFFE0007FFFE0007FFFE000 -0007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E000 -0007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E000 -0007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0007FFFFFFC -FFFFFFFEFFFFFFFEFFFFFFFE7FFFFFFC1F3479B32C>105 D<7FFFE00000FFFFF00000FF -FFF00000FFFFF000007FFFF000000003F000000003F000000003F000000003F000000003 -F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 -00000003F000000003F000000003F000000003F000000003F000000003F000000003F000 -000003F000000003F000000003F000000003F000000003F000000003F000000003F00000 -0003F000000003F000000003F000000003F000000003F000000003F000000003F0000000 -03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 -F000007FFFFFFF80FFFFFFFFC0FFFFFFFFC0FFFFFFFFC07FFFFFFF8022337BB22C>108 -D<0007FC0000001FFF0000007FFFC00001FFFFF00003FFFFF80007FC07FC000FF001FE00 -1FE000FF001F80003F003F80003F803F00001F807E00000FC07E00000FC07E00000FC0FC -000007E0FC000007E0FC000007E0FC000007E0FC000007E0FC000007E0FC000007E0FE00 -000FE07E00000FC07E00000FC07F00001FC03F00001F803F80003F801FC0007F001FE000 -FF000FF001FE0007FC07FC0003FFFFF80001FFFFF000007FFFC000001FFF00000007FC00 -0023247CA32C>111 D<7FF01FE000FFF8FFF800FFFBFFFE00FFFFFFFF007FFFFFFF8001 -FFF07FC001FF801FE001FF0007F001FE0003F801FC0003F801FC0001FC01F80000FC01F8 -0000FC01F80000FE01F800007E01F800007E01F800007E01F800007E01F800007E01F800 -007E01F800007E01F800007E01F80000FE01FC0000FC01FC0000FC01FC0001F801FE0003 -F801FF0007F001FF000FF001FF801FE001FFE07FC001FFFFFF8001FFFFFF0001FBFFFE00 -01F8FFF80001F83FC00001F800000001F800000001F800000001F800000001F800000001 -F800000001F800000001F800000001F800000001F800000001F800000001F800000001F8 -0000007FFFE00000FFFFF00000FFFFF00000FFFFF000007FFFE0000027367FA32C>I<7F -FE003FC0FFFF01FFF0FFFF07FFF8FFFF1FFFFC7FFF3FFFFC003F7FE1FC003FFF01FC003F -FC00F8003FF80070003FF00000003FE00000003FE00000003FC00000003F800000003F80 -0000003F800000003F000000003F000000003F000000003F000000003F000000003F0000 -00003F000000003F000000003F000000003F000000003F000000003F000000003F000000 -003F000000003F0000007FFFFFE000FFFFFFF000FFFFFFF000FFFFFFF0007FFFFFE00026 -247EA32C>114 D<001E000000003F000000003F000000003F000000003F000000003F00 -0000003F000000003F000000003F000000003F0000007FFFFFFF00FFFFFFFF80FFFFFFFF -80FFFFFFFF807FFFFFFF00003F000000003F000000003F000000003F000000003F000000 -003F000000003F000000003F000000003F000000003F000000003F000000003F00000000 -3F000000003F000000003F000000003F000000003F000000003F0003C0003F0007E0003F -0007E0003F0007E0003F0007E0003F0007E0003F800FE0001F801FC0001FE07FC0000FFF -FF80000FFFFF000003FFFE000001FFF80000003FE000232E7EAD2C>116 -D<7FF003FF8000FFF807FFC000FFF807FFC000FFF807FFC0007FF803FFC00001F8000FC0 -0001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC0 -0001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC0 -0001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC0 -0001F8000FC00001F8000FC00001F8001FC00001F8001FC00001F8003FC00001FC007FC0 -0000FE03FFC00000FFFFFFFF00007FFFFFFF80003FFFFFFF80001FFFCFFF800003FE07FF -0029247FA32C>I E /Fv 34 125 df<001F00001F80003F80007F80007F8000FF0001FE -0003FC0003F80007F0000FE0000F80001F00003E00003C0000780000E000004000001112 -6CC431>19 D -45 D<0000000FFE000060000000FFFFC000E0000003FFFFF000E000000FFC01FC01E000 -003FC0003E01E00000FF00000F83E00003FC000003C7E00007F8000001E7E0000FF00000 -00FFE0001FE00000007FE0003FC00000003FE0007F800000001FE000FF000000000FE001 -FE000000000FE001FC0000000007E003FC0000000007E007F80000000003E007F8000000 -0003E00FF00000000001E00FF00000000001E01FE00000000000E01FE00000000000E03F -E00000000000E03FE00000000000E03FC00000000000607FC00000000000607FC0000000 -0000607FC00000000000607FC0000000000000FF80000000000000FF80000000000000FF -80000000000000FF80000000000000FF80000000000000FF80000000000000FF80000000 -000000FF80000000000000FF80000000000000FF80000000000000FF80000000000000FF -80000000000000FF80000000000000FF800000000000007FC00000000000007FC0000000 -0000007FC00000000000607FC00000000000603FC00000000000603FE00000000000603F -E00000000000601FE00000000000E01FF00000000000E00FF00000000000C00FF0000000 -0000C007F80000000001C007F800000000018003FC00000000038001FC00000000038001 -FE00000000070000FF000000000600007F800000000E00003FC00000001C00001FE00000 -003800000FF000000078000007F8000000F0000003FC000001E0000000FF000007800000 -003FC0001F000000000FFC00FC0000000003FFFFF00000000000FFFFC000000000000FFE -0000003B487BC546>67 DI70 -D72 DI76 D80 -D82 D85 D87 D<0007FC000000003FFF80000000F80FE0000003C003F00000070001F800000E0000 -FC00000FC0007E00001FE0007F00001FF0003F80001FF0003F80001FF0003F80001FF000 -1FC0001FF0001FC0000FE0001FC0000380001FC0000000001FC0000000001FC000000000 -1FC0000000001FC00000000FFFC0000001FFFFC000000FFE1FC000003FC01FC00000FF00 -1FC00003FC001FC00007F8001FC0000FF0001FC0001FE0001FC0003FC0001FC0007FC000 -1FC0007F80001FC0007F80001FC060FF00001FC060FF00001FC060FF00001FC060FF0000 -3FC060FF00003FC060FF00003FC060FF80007FC0607F8000EFC0607FC000C7E0C03FC001 -C7E0C01FE00783F1C007F81E03FF8001FFFC01FF00001FE0007C002B2E7CAC31>97 -D<01FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC03FC000001FC0FFF800001FC3C07E00001FC7001F80001FDE0007E -0001FD80003F0001FF80001F8001FF00001FC001FE00000FE001FC000007E001FC000007 -F001FC000007F001FC000003F801FC000003F801FC000003FC01FC000003FC01FC000001 -FC01FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001 -FE01FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001 -FC01FC000003FC01FC000003FC01FC000003F801FC000003F801FC000007F001FC000007 -F001FE00000FE001FE00000FC001FF00001FC001FB00003F8001F380007E0001E1C000FC -0001E0F001F80001C03C07E00001801FFF8000000003FC00002F467DC436>I<00007F80 -000003FFF000000FC07C00003F000F0000FC00038001F80001C003F8000FC007F0001FE0 -07E0003FE00FE0003FE01FC0003FE01FC0003FE03F80003FE03F80001FC07F800007007F -800000007F800000007F00000000FF00000000FF00000000FF00000000FF00000000FF00 -000000FF00000000FF00000000FF00000000FF00000000FF00000000FF000000007F0000 -00007F800000007F800000003F800000003F800000303FC00000301FC00000700FE00000 -600FE00000E007F00000C003F80001C001F800038000FC000700003F001E00001FC07800 -0007FFF0000000FF8000242E7DAC2B>I<000000007F000000003FFF000000003FFF0000 -00003FFF0000000001FF0000000000FF00000000007F00000000007F00000000007F0000 -0000007F00000000007F00000000007F00000000007F00000000007F00000000007F0000 -0000007F00000000007F00000000007F00000000007F00000000007F00000000007F0000 -0000007F00000000007F00000000007F00000000007F0000007F807F000003FFF07F0000 -0FC07C7F00003F000E7F00007E00077F0000FC0003FF0003F80001FF0007F00000FF0007 -E00000FF000FE000007F001FC000007F001FC000007F003F8000007F003F8000007F007F -8000007F007F8000007F007F0000007F00FF0000007F00FF0000007F00FF0000007F00FF -0000007F00FF0000007F00FF0000007F00FF0000007F00FF0000007F00FF0000007F00FF -0000007F00FF0000007F007F0000007F007F8000007F007F8000007F003F8000007F003F -8000007F001FC000007F001FC000007F000FC00000FF000FE00000FF0007F00001FF0003 -F00003FF0001F800077F8000FC000E7FC0003F001C7FFE000FC0F87FFE0003FFE07FFE00 -007F007F002F467DC436>I<0001FE00000007FFC000001F03F000007E00FC0000FC007E -0001F8003F0003F0003F0007E0001F800FE0001FC00FC0000FC01FC0000FC03F80000FE0 -3F800007E03F800007E07F800007F07F000007F07F000007F0FF000007F0FF000007F0FF -000007F0FFFFFFFFF0FFFFFFFFF0FF00000000FF00000000FF00000000FF00000000FF00 -000000FF000000007F000000007F000000007F800000007F800000003F800000003F8000 -00301FC00000301FC00000700FC00000600FE00000E007F00000C003F00001C001F80003 -8000FC000700003E001E00001F80F8000003FFE0000000FF0000242E7DAC2B>I<00000F -E00000007FF8000001F81E000003F03F00000FE07F80001FC0FF80001F80FF80003F80FF -80007F00FF80007F00FF80007F007F0000FE001C0000FE00000000FE00000000FE000000 -00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000 -FE00000000FE00000000FE00000000FE00000000FE000000FFFFFF8000FFFFFF8000FFFF -FF800000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 -000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 -0000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000 -00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000 -FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE -00000001FF8000007FFFFF00007FFFFF00007FFFFF000021467EC51E>I<000000000F80 -0001FC007FE0000FFF81F0F0003F07E381F000FC01FF03F001F800FE01F003F0007E01E0 -07F0007F000007E0003F00000FE0003F80000FC0001F80001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0000FC0001F80000FE0003F800007E0003F000007F0007F000003F0007E0000 -01F800FC000001FC01F8000003BF07E00000030FFF8000000701FC000000070000000000 -0700000000000F00000000000F00000000000F00000000000F800000000007C000000000 -07E00000000007FFFFF8000003FFFFFF000003FFFFFFE00001FFFFFFF800007FFFFFFC00 -01FFFFFFFE0007C0000FFF000F800000FF003F0000003F803E0000001F807C0000000FC0 -7C0000000FC0F800000007C0F800000007C0F800000007C0F800000007C0F800000007C0 -FC0000000FC07C0000000F807E0000001F803E0000001F001F0000003E000F8000007C00 -07E00001F80001F80007E000007F003F8000001FFFFE00000001FFE000002C427DAC31> -I<01FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC01FE000001FC07FFC00001FC1E07F00001FC3801F80001FC7001FC -0001FCE000FC0001FDC000FE0001FD8000FE0001FF80007F0001FF00007F0001FF00007F -0001FE00007F0001FE00007F0001FE00007F0001FC00007F0001FC00007F0001FC00007F -0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F -0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F -0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F -0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0003FE0000FF -80FFFFF83FFFFEFFFFF83FFFFEFFFFF83FFFFE2F457DC436>I<01E00007F80007F8000F -FC000FFC000FFC000FFC0007F80007F80001E00000000000000000000000000000000000 -000000000000000000000000000000000000000000000001FC00FFFC00FFFC00FFFC0007 -FC0003FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001 -FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001 -FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0003 -FE00FFFFF8FFFFF8FFFFF815437DC21C>I<01FC00FFFC00FFFC00FFFC0007FC0003FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 -01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0003FE00 -FFFFF8FFFFF8FFFFF815457DC41C>108 D<01FC00FF00001FE00000FFFC07FFE000FFFC -0000FFFC0F03F801E07F0000FFFC3C01FC07803F800007FC7000FE0E001FC00003FCE000 -7E1C000FC00001FDC0007F38000FE00001FD80007F30000FE00001FF80003FF00007F000 -01FF00003FE00007F00001FF00003FE00007F00001FE00003FC00007F00001FE00003FC0 -0007F00001FE00003FC00007F00001FC00003F800007F00001FC00003F800007F00001FC -00003F800007F00001FC00003F800007F00001FC00003F800007F00001FC00003F800007 -F00001FC00003F800007F00001FC00003F800007F00001FC00003F800007F00001FC0000 -3F800007F00001FC00003F800007F00001FC00003F800007F00001FC00003F800007F000 -01FC00003F800007F00001FC00003F800007F00001FC00003F800007F00001FC00003F80 -0007F00001FC00003F800007F00001FC00003F800007F00001FC00003F800007F00001FC -00003F800007F00001FC00003F800007F00001FC00003F800007F00001FC00003F800007 -F00001FC00003F800007F00001FC00003F800007F00003FE00007FC0000FF800FFFFF81F -FFFF03FFFFE0FFFFF81FFFFF03FFFFE0FFFFF81FFFFF03FFFFE04B2C7DAB52>I<01FC01 -FE0000FFFC07FFC000FFFC1E07F000FFFC3801F80007FC7001FC0003FCE000FC0001FDC0 -00FE0001FD8000FE0001FF80007F0001FF00007F0001FF00007F0001FE00007F0001FE00 -007F0001FE00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00 -007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00 -007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00 -007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00 -007F0001FC00007F0001FC00007F0001FC00007F0003FE0000FF80FFFFF83FFFFEFFFFF8 -3FFFFEFFFFF83FFFFE2F2C7DAB36>I<00007F8000000003FFF00000000FC0FC0000003E -001F0000007C000F800000F80007C00001F00003E00003E00001F00007C00000F8000FC0 -0000FC000FC00000FC001F8000007E003F8000007F003F8000007F003F0000003F007F00 -00003F807F0000003F807F0000003F807F0000003F80FF0000003FC0FF0000003FC0FF00 -00003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF00 -00003FC0FF0000003FC07F0000003F807F0000003F807F8000007F803F8000007F003F80 -00007F001F8000007E001FC00000FE000FC00000FC000FE00001FC0007E00001F80003F0 -0003F00001F80007E00000FC000FC000003E001F0000001FC0FE00000007FFF800000000 -7F8000002A2E7DAC31>I<01FC03FC0000FFFC0FFF8000FFFC3C07E000FFFC7001F80007 -FDE000FE0001FD80007F0001FF80003F8001FF00001FC001FE00001FE001FC00000FE001 -FC00000FF001FC000007F001FC000007F801FC000003F801FC000003FC01FC000003FC01 -FC000003FC01FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001FE01 -FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001FE01 -FC000003FC01FC000003FC01FC000003FC01FC000007F801FC000007F801FC000007F001 -FC00000FF001FE00000FE001FE00001FC001FF00003FC001FF00003F8001FF80007E0001 -FDC000FC0001FCF003F80001FC3C0FE00001FC1FFF800001FC03FC000001FC0000000001 -FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 -FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 -FC0000000003FE00000000FFFFF8000000FFFFF8000000FFFFF80000002F3F7DAB36>I< -00007F8003000003FFE00700000FE0780700003F801C0F00007E000E0F0000FC00071F00 -03F800039F0007F80001BF0007F00001FF000FE00000FF001FE00000FF001FC00000FF00 -3FC000007F003FC000007F007F8000007F007F8000007F007F8000007F00FF0000007F00 -FF0000007F00FF0000007F00FF0000007F00FF0000007F00FF0000007F00FF0000007F00 -FF0000007F00FF0000007F00FF0000007F00FF0000007F007F8000007F007F8000007F00 -7F8000007F003F8000007F003FC000007F001FC000007F001FE00000FF000FE00000FF00 -0FF00001FF0007F00001FF0003F80003FF0001FC00077F0000FE000E7F00003F001C7F00 -000FC0F87F000003FFE07F0000007F007F00000000007F00000000007F00000000007F00 -000000007F00000000007F00000000007F00000000007F00000000007F00000000007F00 -000000007F00000000007F00000000007F00000000007F00000000007F0000000000FF80 -0000003FFFFE0000003FFFFE0000003FFFFE2F3F7DAB33>I<03F803F0FFF81FFCFFF83C -3EFFF8707F07F8E0FF03F9C0FF01F980FF01FB80FF01FB007E01FB003C01FF000001FE00 -0001FE000001FE000001FE000001FC000001FC000001FC000001FC000001FC000001FC00 -0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00 -0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00 -0001FC000003FF0000FFFFFE00FFFFFE00FFFFFE00202C7DAB26>I<003FE01801FFFC38 -07E01F780F0003F81E0001F83C0000F87C00007878000078F8000038F8000038F8000018 -F8000018FC000018FC000018FE000018FF8000007FC000007FFC00003FFFE0001FFFFC00 -0FFFFF0007FFFFC003FFFFE000FFFFF0001FFFF80000FFF800000FFC000003FCC00001FE -C00000FEC000007EE000007EE000003EE000003EF000003EF000003EF000003EF800003C -FC00007CFC000078FE0000F8FF0001F0F38003E0F1F00F80E07FFE00C00FF0001F2E7DAC -26>I<0006000000060000000600000006000000060000000E0000000E0000000E000000 -0E0000001E0000001E0000001E0000003E0000007E0000007E000000FE000001FE000007 -FE00001FFFFFF0FFFFFFF0FFFFFFF000FE000000FE000000FE000000FE000000FE000000 -FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000 -FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000C00 -FE000C00FE000C00FE000C00FE000C00FE000C00FE000C00FE000C00FE000C00FE000C00 -7E001C007F0018007F0018003F0038001F8030001FC0700007E0E00001FFC000007F001E -3E7EBC26>I<01FC00007F00FFFC003FFF00FFFC003FFF00FFFC003FFF0007FC0001FF00 -03FC0000FF0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F00 -01FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F00 -01FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F00 -01FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F00 -01FC00007F0001FC00007F0001FC00007F0001FC0000FF0001FC0000FF0001FC0000FF00 -01FC0001FF0001FC0001FF0000FC0001FF0000FE0003FF00007E00077F80007F000E7FC0 -003F001C7FFE000FC0787FFE0003FFF07FFE00007F807F002F2D7DAB36>I121 D<3FFFFFFFE03FFFFFFFE03FC0003F -E03F00003FC03C00007F80380000FF00380000FF00300001FE00700003FC00700003FC00 -700007F80060000FF00060000FF00060001FE00060003FC00060003FC00000007F800000 -00FF00000001FF00000001FE00000003FC00000007FC00000007F80000000FF00000001F -F00000001FE00060003FC00060007F800060007F80006000FF0000C001FE0000C001FE00 -00C003FC0000C007F80000C007F80001C00FF00001C01FE00003C01FE00003C03FC00007 -807F80001F80FF8000FF80FFFFFFFF80FFFFFFFF80232B7DAA2B>I124 D -E /Fw 21 118 df<0F003FC07FE0FFF0FFF0FFF0FFF0FFF0FFF07FE03FC00F000C0C748B -24>46 D<00000FFE00000000007FFFE000000003FFFFF80000000FFFFFFE0000001FE00F -FF8000003E0001FFE00000FC00007FF00001F000003FF80003E000000FFC0003C0000007 -FE000780000003FF000F00000003FF800E00000001FF801E00000000FFC01C00000000FF -C03C000000007FE038000000007FE078000000003FF070000000003FF070000000003FF0 -70000000003FF0FF800000001FF8FFE00000001FF8FFE00000001FF8FFF00000001FF8FF -F00000001FF8FFF00000001FF8FFF00000001FF8FFF00000001FF8FFF00000001FF87FE0 -0000001FF83FC00000001FF806000000001FF000000000003FF000000000003FF0000000 -00003FF000000000003FE000000000007FE000000000007FE00000000000FFC000000000 -00FFC00000000000FF800000000001FF800000000001FF000000000003FE000000000007 -FE000000000007FC00000000000FF800000000000FF000000000001FF000000000003FE0 -00000000007FC000000000007F800000000000FF000000000001FE000000000003FC0000 -00000003F8000000000007F000000000000FE000000000001FC000000000003F80000000 -00007F0000000000007E000000000000FC000000000001F8000000000003F00000000000 -07E000000000000FC000000000001F8000000000003F0000000000003E0000000000007C -000000380000F8000000380001F0000000380003E0000000380007C000000070000F8000 -000070001F0000000070001E0000000070003C0000000070007800000000F000F0000000 -00F001E000000000E003C000000001E0078000000003E00FFFFFFFFFFFE00FFFFFFFFFFF -E01FFFFFFFFFFFE03FFFFFFFFFFFE07FFFFFFFFFFFE0FFFFFFFFFFFFC0FFFFFFFFFFFFC0 -FFFFFFFFFFFFC0FFFFFFFFFFFFC0355E7ADD42>50 D<0180000000030001E00000000F00 -01FC0000003F0001FF800003FE0001FFF8003FFC0001FFFFFFFFF80001FFFFFFFFF00001 -FFFFFFFFE00001FFFFFFFF800001FFFFFFFF000001FFFFFFFC000001DFFFFFF0000001C3 -FFFF80000001C03FF800000001C0000000000001C0000000000001C0000000000001C000 -0000000001C0000000000001C0000000000001C0000000000001C0000000000001C00000 -00000001C0000000000001C0000000000001C0000000000001C0000000000001C0000000 -000001C0000000000001C0000000000001C0000000000001C0000000000001C000000000 -0001C0000000000001C0000000000001C001FF80000001C01FFFF0000001C07FFFFC0000 -01C1FE00FF000001C3E0003F800001CF80001FE00001DF00000FF00001FC000007F80001 -F8000003FC0001F0000001FC0001F0000001FE0001E0000000FF0001C0000000FF000000 -0000007F8000000000007FC000000000007FC000000000003FC000000000003FE0000000 -00003FE000000000003FF000000000003FF000000000001FF000000000001FF000000000 -001FF000000000001FF800000000001FF800000000001FF800000000001FF80000000000 -1FF800000000001FF81F800000001FF87FC00000001FF87FE00000001FF8FFE00000001F -F8FFF00000001FF8FFF00000001FF8FFF00000001FF0FFE00000001FF0FFE00000003FF0 -FFC00000003FF0FF800000003FE070000000003FE070000000003FE078000000007FC078 -000000007FC03C00000000FF803C00000000FF801E00000001FF001E00000001FF000F00 -000003FE000780000007FC0007C0000007F80003E000000FF00001F800003FE00000FC00 -007FC000007F0001FF8000003FF00FFE0000000FFFFFF800000003FFFFE000000000FFFF -80000000000FF800000035607ADD42>53 D76 DI80 -D82 D<00003FF0000000000003FFFE000000 -00000FFFFF80000000003FC03FE0000000007E0007F800000000F80003FC00000001E000 -01FE00000003C00000FF000000078000007F8000000F0000003FC000000F8000003FC000 -000FF000001FE000001FF800001FE000001FFC00000FF000001FFC00000FF000001FFC00 -000FF000001FFC000007F800001FFC000007F800001FFC000007F800000FF8000007F800 -0003E0000007F800000000000007F800000000000007F800000000000007F80000000000 -0007F800000000000007F800000000000007F80000000000007FF800000000007FFFF800 -0000000FFFFFF8000000007FF807F800000001FF8007F800000007FC0007F80000001FF0 -0007F80000007FC00007F8000000FF800007F8000003FE000007F8000007FC000007F800 -000FFC000007F800000FF8000007F800001FF0000007F800003FE0000007F800003FE000 -0007F800007FC0000007F800E07FC0000007F800E07FC0000007F800E0FFC0000007F800 -E0FF80000007F800E0FF80000007F800E0FF8000000FF800E0FF8000000FF800E0FF8000 -000FF800E0FF8000001FF800E0FFC000001BF800E07FC000003BF800E07FC0000073F800 -E07FE0000071FC01C03FF00000E1FC01C01FF00001C1FC01C00FFC000780FE038007FE00 -0F00FF070001FF807E007FFF00007FFFF8003FFE00001FFFE0001FF8000001FF000007E0 -003B417ABF42>97 D<000001FF80000000000FFFF8000000003FFFFE00000000FF007F80 -000003FC0007E0000007F00001F000001FE000007800003FC000003C00007F8000001E00 -00FF0000000F0001FE0000001F0001FC000000FF0003FC000001FF8007F8000003FF8007 -F8000003FF800FF0000003FF800FF0000003FF801FE0000003FF801FE0000003FF803FE0 -000001FF003FC00000007C003FC000000000007FC000000000007FC000000000007FC000 -000000007F800000000000FF800000000000FF800000000000FF800000000000FF800000 -000000FF800000000000FF800000000000FF800000000000FF800000000000FF80000000 -0000FF800000000000FF800000000000FF800000000000FF8000000000007F8000000000 -007FC000000000007FC000000000007FC000000000007FC000000000003FC00000000000 -3FE000000000003FE000000000001FE000000001C01FF000000001C00FF000000003C00F -F8000000038007F8000000038003FC000000078003FE000000070001FE0000000F0000FF -0000001E00007F8000003C00003FC000007800001FE00000F000000FF80001E0000003FC -0007C0000000FF803F800000003FFFFE000000000FFFF80000000001FF80000032417CBF -3A>99 D<000003FE00000000001FFFE000000000FFFFF800000001FE03FE00000007F000 -7F8000000FE0003FC000003FC0001FE000007F00000FF00000FF000007F80000FE000003 -F80001FC000003FC0003F8000001FC0007F8000001FE0007F0000000FE000FF0000000FF -000FF00000007F001FE00000007F001FE00000007F803FE00000007F803FC00000003F80 -3FC00000003F807FC00000003FC07FC00000003FC07FC00000003FC07F800000003FC07F -800000003FC0FF800000003FC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FF80 -0000000000FF800000000000FF800000000000FF800000000000FF800000000000FF8000 -00000000FF800000000000FF800000000000FF8000000000007F8000000000007FC00000 -0000007FC000000000007FC000000000003FC000000000003FC000000000003FE0000000 -00001FE000000000001FE000000001C00FF000000001C00FF000000003C007F800000003 -8007F8000000038003FC000000078001FC0000000F0001FE0000000E0000FF0000001E00 -007F8000003C00003FC000007800001FE00000F0000007F00003E0000003FC0007C00000 -00FF803F000000003FFFFC000000000FFFF00000000001FF80000032417CBF3A>101 -D<0000000FF0000000007FFC00000001FFFF00000007F81F8000000FE00FC000001FC03F -C000003F807FE000007F007FE00000FF007FE00001FE007FE00001FC007FE00003FC003F -C00003FC003FC00007F8000F000007F80000000007F8000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000FFFFFFFFF000FFFFFFFFF000FFFFFFFFF0 -00FFFFFFFFF000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000 -00000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000001FF80000 -00003FFE0000003FFFFFFF00003FFFFFFF00003FFFFFFF00003FFFFFFF00002B657EE428 ->I<0000000000003F80000003FC0001FFE000003FFFC007FFF00000FFFFF01FC1F80003 -FC03FC3E03F80007F000FE7803F8000FE0007FE003F8001FC0003FC003F8003F80001FC0 -01F0007F00000FE0000000FE000007F0000000FE000007F0000001FC000003F8000001FC -000003F8000003FC000003FC000003FC000003FC000003F8000001FC000007F8000001FE -000007F8000001FE000007F8000001FE000007F8000001FE000007F8000001FE000007F8 -000001FE000007F8000001FE000007F8000001FE000007F8000001FE000007F8000001FE -000003F8000001FC000003FC000003FC000003FC000003FC000001FC000003F8000001FC -000003F8000000FE000007F0000000FE000007F00000007F00000FE00000003F80001FC0 -0000001FC0003F800000003FE0007F0000000037F000FE0000000073FC03FC0000000060 -FFFFF000000000E03FFFC000000000E003FC0000000001C000000000000001C000000000 -000001C000000000000001C000000000000001C000000000000001E000000000000001E0 -00000000000001F000000000000001F000000000000001F800000000000000FC00000000 -000000FF00000000000000FFFFFFFE000000007FFFFFFFF00000003FFFFFFFFE0000001F -FFFFFFFF8000000FFFFFFFFFE000000FFFFFFFFFF000003FFFFFFFFFFC0000FE000001FF -FE0003F80000001FFE0007E000000003FF000FC000000000FF801F80000000007F803F80 -000000003FC03F00000000001FC07E00000000001FC07E00000000000FE0FE0000000000 -0FE0FC000000000007E0FC000000000007E0FC000000000007E0FC000000000007E0FC00 -0000000007E0FC000000000007E0FE00000000000FE07E00000000000FC07E0000000000 -0FC07F00000000001FC03F80000000003F801FC0000000007F000FC0000000007E0007F0 -00000001FC0003F800000003F80001FC00000007F000007F0000001FC000003FE00000FF -8000000FFE000FFE00000001FFFFFFF0000000003FFFFF800000000001FFF00000003D5E -7DBF42>I<0003C000000000000007FFC0000000000000FFFFC0000000000000FFFFC000 -0000000000FFFFC0000000000000FFFFC000000000000001FFC0000000000000007FC000 -0000000000007FC0000000000000003FC0000000000000003FC0000000000000003FC000 -0000000000003FC0000000000000003FC0000000000000003FC0000000000000003FC000 -0000000000003FC0000000000000003FC0000000000000003FC0000000000000003FC000 -0000000000003FC0000000000000003FC0000000000000003FC0000000000000003FC000 -0000000000003FC0000000000000003FC0000000000000003FC0000000000000003FC000 -0000000000003FC0000000000000003FC0000000000000003FC0000000000000003FC000 -0000000000003FC0000000000000003FC0000000000000003FC0000000000000003FC000 -0000000000003FC0000000000000003FC0007FE0000000003FC003FFFC000000003FC00F -FFFF000000003FC03F00FFC00000003FC078001FE00000003FC0F0000FF00000003FC1C0 -0007F80000003FC3800007FC0000003FC7000003FC0000003FCE000003FE0000003FCE00 -0001FE0000003FDC000001FE0000003FD8000001FE0000003FF8000000FF0000003FF000 -0000FF0000003FF0000000FF0000003FF0000000FF0000003FE0000000FF0000003FE000 -0000FF0000003FE0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000007FE0000001FF800000FFF000 -0003FFC000FFFFFFF003FFFFFFC0FFFFFFF003FFFFFFC0FFFFFFF003FFFFFFC0FFFFFFF0 -03FFFFFFC042647DE349>I<003C000000FF000001FF800003FFC00003FFC00003FFC000 -03FFC00003FFC00003FFC00001FF800000FF0000003C0000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000003C000 -07FFC0007FFFC0007FFFC0007FFFC0007FFFC00001FFC000007FC000007FC000003FC000 -003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000 -003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000 -003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000 -003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000 -003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000 -003FC000003FC000007FE00000FFF000FFFFFFE0FFFFFFE0FFFFFFE0FFFFFFE01B5F7DDE -23>I<0003C00007FFC000FFFFC000FFFFC000FFFFC000FFFFC00001FFC000007FC00000 -7FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000 -3FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000 -3FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000 -3FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000 -3FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000 -3FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000 -3FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000 -3FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000 -3FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000 -3FC000003FC000003FC000003FC000003FC000007FE00000FFF000FFFFFFF0FFFFFFF0FF -FFFFF0FFFFFFF01C647DE323>108 D<0003C000FFC0000007FE00000007FFC003FFF800 -001FFFC00000FFFFC00FFFFE00007FFFF00000FFFFC03F00FF8001F807FC0000FFFFC078 -003FC003C001FE0000FFFFC1E0001FE00F0000FF000001FFC3C0000FF01E00007F800000 -7FC3800007F81C00003FC000007FC7000007F83800003FC000003FCE000003FC7000001F -E000003FCC000003FC6000001FE000003FDC000003FCE000001FE000003FD8000003FCC0 -00001FE000003FF8000001FFC000000FF000003FF0000001FF8000000FF000003FF00000 -01FF8000000FF000003FE0000001FF0000000FF000003FE0000001FF0000000FF000003F -E0000001FF0000000FF000003FE0000001FF0000000FF000003FC0000001FE0000000FF0 -00003FC0000001FE0000000FF000003FC0000001FE0000000FF000003FC0000001FE0000 -000FF000003FC0000001FE0000000FF000003FC0000001FE0000000FF000003FC0000001 -FE0000000FF000003FC0000001FE0000000FF000003FC0000001FE0000000FF000003FC0 -000001FE0000000FF000003FC0000001FE0000000FF000003FC0000001FE0000000FF000 -003FC0000001FE0000000FF000003FC0000001FE0000000FF000003FC0000001FE000000 -0FF000003FC0000001FE0000000FF000003FC0000001FE0000000FF000003FC0000001FE -0000000FF000003FC0000001FE0000000FF000003FC0000001FE0000000FF000003FC000 -0001FE0000000FF000003FC0000001FE0000000FF000003FC0000001FE0000000FF00000 -3FC0000001FE0000000FF000003FC0000001FE0000000FF000003FC0000001FE0000000F -F000003FC0000001FE0000000FF000003FC0000001FE0000000FF000003FC0000001FE00 -00000FF000003FC0000001FE0000000FF000003FC0000001FE0000000FF000003FC00000 -01FE0000000FF000003FC0000001FE0000000FF000003FC0000001FE0000000FF000003F -C0000001FE0000000FF000003FC0000001FE0000000FF000003FC0000001FE0000000FF0 -00007FE0000003FF0000001FF80000FFF0000007FF8000003FFC00FFFFFFF007FFFFFF80 -3FFFFFFCFFFFFFF007FFFFFF803FFFFFFCFFFFFFF007FFFFFF803FFFFFFCFFFFFFF007FF -FFFF803FFFFFFC663F7CBE6F>I<0003C0007FE000000007FFC003FFFC000000FFFFC00F -FFFF000000FFFFC03F00FFC00000FFFFC078001FE00000FFFFC0F0000FF0000001FFC1C0 -0007F80000007FC3800007FC0000007FC7000003FC0000003FCE000003FE0000003FCE00 -0001FE0000003FDC000001FE0000003FD8000001FE0000003FF8000000FF0000003FF000 -0000FF0000003FF0000000FF0000003FF0000000FF0000003FE0000000FF0000003FE000 -0000FF0000003FE0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC000 -0000FF0000003FC0000000FF0000003FC0000000FF0000007FE0000001FF800000FFF000 -0003FFC000FFFFFFF003FFFFFFC0FFFFFFF003FFFFFFC0FFFFFFF003FFFFFFC0FFFFFFF0 -03FFFFFFC0423F7DBE49>I<000000FF8000000000000FFFF800000000003FFFFE000000 -0000FF007F8000000003FC001FE000000007F00007F00000000FC00001F80000003F8000 -00FE0000007F0000007F0000007E0000003F000000FC0000001F800001F80000000FC000 -03F80000000FE00003F000000007E00007F000000007F0000FE000000003F8000FE00000 -0003F8001FE000000003FC001FC000000001FC001FC000000001FC003FC000000001FE00 -3FC000000001FE003FC000000001FE007F8000000000FF007F8000000000FF007F800000 -0000FF007F8000000000FF00FF8000000000FF80FF8000000000FF80FF8000000000FF80 -FF8000000000FF80FF8000000000FF80FF8000000000FF80FF8000000000FF80FF800000 -0000FF80FF8000000000FF80FF8000000000FF80FF8000000000FF80FF8000000000FF80 -7F8000000000FF007F8000000000FF007FC000000001FF007FC000000001FF003FC00000 -0001FE003FC000000001FE003FC000000001FE001FE000000003FC001FE000000003FC00 -1FE000000003FC000FF000000007F80007F000000007F00007F000000007F00003F80000 -000FE00001FC0000001FC00001FC0000001FC00000FE0000003F8000007F0000007F0000 -003F800000FE0000001FC00001FC0000000FF00007F800000003FC001FE000000000FF00 -7F80000000007FFFFF00000000000FFFF8000000000001FFC000000039417CBF42>I<00 -078003F80007FF800FFF00FFFF803FFFC0FFFF807C0FE0FFFF81F01FE0FFFF81E03FF001 -FF83803FF0007F87003FF0007F8F003FF0003F8E003FF0003F9C001FE0003F9C000FC000 -3F98000300003FB8000000003FB8000000003FB0000000003FF0000000003FF000000000 -3FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FC000000000 -3FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000000000 -3FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000000000 -3FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000000000 -3FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000000000 -3FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000000000 -3FC0000000003FC0000000003FC0000000007FE000000000FFF8000000FFFFFFFC0000FF -FFFFFC0000FFFFFFFC0000FFFFFFFC00002C3F7CBE33>114 D<00003800000000003800 -000000003800000000003800000000003800000000003800000000003800000000007800 -00000000780000000000780000000000780000000000F80000000000F80000000000F800 -00000001F80000000001F80000000001F80000000003F80000000003F80000000007F800 -0000000FF8000000001FF8000000001FF8000000007FF800000000FFF800000003FFF800 -00000FFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF000007F80000000007F800 -00000007F80000000007F80000000007F80000000007F80000000007F80000000007F800 -00000007F80000000007F80000000007F80000000007F80000000007F80000000007F800 -00000007F80000000007F80000000007F80000000007F80000000007F80000000007F800 -00000007F80000000007F80000000007F80000000007F80000000007F80000000007F800 -00000007F80000000007F80000000007F80000000007F80000000007F80000000007F800 -00000007F80000E00007F80000E00007F80000E00007F80000E00007F80000E00007F800 -00E00007F80000E00007F80000E00007F80000E00007F80000E00007F80000E00007F800 -00E00007F80000E00007F80000E00003FC0001C00003FC0001C00003FC0001C00003FC00 -03C00001FE0003800001FE0007800000FF00070000007F800F0000003FC01E0000001FF0 -7C0000000FFFF800000003FFE0000000007F80002B597FD733>116 -D<0003C00000000F000007FFC000001FFF0000FFFFC00003FFFF0000FFFFC00003FFFF00 -00FFFFC00003FFFF0000FFFFC00003FFFF000001FFC0000007FF0000007FC0000001FF00 -00007FC0000001FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF00 -00003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF00 -00003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF00 -00003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF00 -00003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF00 -00003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF00 -00003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF00 -00003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF00 -00003FC0000000FF0000003FC0000000FF0000003FC0000000FF0000003FC0000000FF00 -00003FC0000000FF0000003FC0000001FF0000003FC0000001FF0000003FC0000001FF00 -00003FC0000003FF0000003FC0000003FF0000003FC0000003FF0000003FC0000007FF00 -00001FC0000006FF0000001FE000000EFF0000001FE000001CFF0000000FE000001CFF00 -00000FF0000038FF80000007F0000070FF80000003F80001E0FFE0000001FE0003C0FFFF -C00000FFC01F80FFFFC000003FFFFE00FFFFC000000FFFF800FFFFC0000000FFC000FF80 -0042407DBE49>I E end -%%EndProlog -%%BeginSetup -%%Feature: *Resolution 600dpi -TeXDict begin -%%PaperSize: Letter - -%%EndSetup -%%Page: 1 1 -1 0 bop 299 456 a Fw(Reference)44 b(Man)l(ual)h(of)e(the)g(Programming) -g(Language)g(Lua)g(2.5)408 708 y Fv(Rob)s(erto)32 b(Ierusalimsc)m(h)m -(y)98 b(Luiz)32 b(Henrique)i(de)f(Figueiredo)96 b(W)-8 -b(aldemar)31 b(Celes)1514 868 y Fu(lua@icad.puc-rio.)o(br)801 -1080 y Ft(T)-8 b(eC)945 1111 y(Graf)1152 1080 y Fv(|)32 -b(Departamen)m(to)g(de)h(Inform\023)-49 b(atica)31 b(|)h(PUC-Rio)1405 -1272 y Fu(Date:)42 b(1996/11/18)d(14:27:42)1767 1607 -y Fs(Abstract)227 1759 y Fr(Lua)e(is)f(an)h(extension)f(programming)f -(language)g(designed)i(to)f(b)r(e)i(used)f(as)f(a)g(con\014guration)f -(language)227 1859 y(for)28 b(an)n(y)f(program)f(that)i(needs)g(one.)38 -b(This)28 b(do)r(cumen)n(t)g(describ)r(es)f(v)n(ersion)g(2.5)g(of)h -(the)g(Lua)g(programming)227 1958 y(language)21 b(and)i(the)g(API)g -(that)g(allo)n(ws)e(in)n(teraction)h(b)r(et)n(w)n(een)h(Lua)f(programs) -e(and)j(their)g(host)f(C)h(programs.)227 2058 y(The)28 -b(do)r(cumen)n(t)g(also)e(presen)n(ts)h(some)g(examples)g(of)g(using)h -(the)g(main)f(features)g(of)h(the)g(system.)1845 2488 -y Fs(Sum)o(\023)-47 b(ario)227 2624 y Fr(Lua)21 b(\023)-39 -b(e)23 b(uma)g(linguagem)f(de)i(extens~)-42 b(ao)22 b(pro)5 -b(jetada)22 b(para)g(ser)h(usada)f(como)h(linguagem)f(de)i -(con\014gura\030)-37 b(c~)-42 b(ao)21 b(em)227 2723 y(qualquer)26 -b(programa)d(que)k(precise)e(de)i(uma.)36 b(Este)26 b(do)r(cumen)n(to)g -(descrev)n(e)f(a)h(v)n(ers~)-42 b(ao)25 b(2.5)g(da)h(linguagem)g(de)227 -2823 y(programa\030)-37 b(c~)-42 b(ao)22 b(Lua)j(e)h(a)f(In)n(terface)g -(de)g(Programa\030)-37 b(c~)-42 b(ao)22 b(\(API\))k(que)f(p)r(ermite)h -(a)f(in)n(tera\030)-37 b(c~)-42 b(ao)24 b(en)n(tre)h(programas)227 -2923 y(Lua)30 b(e)g(programas)d(C)j(hosp)r(edeiros.)43 -b(O)29 b(do)r(cumen)n(to)h(tam)n(b)n(\023)-39 b(em)29 -b(apresen)n(ta)f(alguns)i(exemplos)f(de)h(uso)f(das)227 -3022 y(principais)e(caracter)-9 b(\023)-32 b(\020sticas)24 -b(do)k(sistema.)0 3309 y Fq(1)135 b(In)l(tro)t(duction)0 -3512 y Fp(Lua)34 b(is)f(an)i(extension)f(programming)f(language)i -(designed)e(to)i(supp)s(ort)d(general)j(pro)s(cedural)d(programming)0 -3625 y(features)i(with)f(data)h(description)e(facilities.)49 -b(It)34 b(is)f(in)m(tended)f(to)j(b)s(e)e(used)g(as)h(a)g -(con\014guration)f(language)h(for)0 3737 y(an)m(y)42 -b(program)g(that)g(needs)f(one.)76 b(Lua)41 b(has)h(b)s(een)f(designed) -f(and)h(implemen)m(ted)g(b)m(y)g(W.)i(Celes,)h(L.)e(H.)g(de)0 -3850 y(Figueiredo)29 b(and)h(R.)h(Ierusalimsc)m(h)m(y)-8 -b(.)141 3963 y(Lua)23 b(is)g(implemen)m(ted)e(as)j(a)g(library)-8 -b(,)23 b(written)f(in)g(C.)i(Being)f(an)g(extension)g(language,)j(Lua)d -(has)g(no)g(notion)g(of)0 4076 y(a)g(\\main")g(program:)36 -b(it)23 b(only)e(w)m(orks)i Fo(emb)-5 b(e)g(dde)g(d)25 -b Fp(in)c(a)i(host)g(clien)m(t,)h(called)e(the)h Fo(emb)-5 -b(e)g(dding)24 b Fp(program.)38 b(This)21 b(host)0 4189 -y(program)30 b(can)g(in)m(v)m(ok)m(e)h(functions)e(to)i(execute)h(a)e -(piece)g(of)g(co)s(de)h(in)e(Lua,)h(can)g(write)g(and)f(read)h(Lua)g(v) --5 b(ariables,)0 4302 y(and)27 b(can)h(register)f(C)h(functions)e(to)i -(b)s(e)f(called)g(b)m(y)h(Lua)f(co)s(de.)40 b(Through)26 -b(the)i(use)f(of)h(C)f(functions,)g(Lua)h(can)g(b)s(e)0 -4415 y(augmen)m(ted)d(to)f(cop)s(e)g(with)f(rather)g(di\013eren)m(t)h -(domains,)g(th)m(us)f(creating)h(customized)g(programming)f(languages)0 -4528 y(sharing)29 b(a)i(syn)m(tactical)g(framew)m(ork.)141 -4641 y(Lua)22 b(is)f(free-distribution)d(soft)m(w)m(are,)25 -b(and)d(pro)m(vided)e(as)i(usual)e(with)h(no)h(guaran)m(tees.)39 -b(The)21 b(implemen)m(tation)0 4754 y(describ)s(ed)28 -b(in)h(this)h(man)m(ual)f(is)h(a)m(v)-5 b(ailable)29 -b(at)j(the)e(follo)m(wing)f(URL's:)143 4941 y Fn -(http://www.inf.puc-rio.br)o(/~ro)o(ber)o(to/l)o(ua.h)o(tml)143 -5054 y(ftp://ftp.icad.puc-rio.br)o(/pub)o(/lu)o(a/lu)o(a.ta)o(r.g)o(z) -1927 5589 y Fp(1)p eop -%%Page: 2 2 -2 1 bop 0 91 a Fq(2)135 b(En)l(vironmen)l(t)46 b(and)e(Ch)l(unks)0 -294 y Fp(All)19 b(statemen)m(ts)k(in)c(Lua)h(are)h(executed)h(in)d(a)i -Fo(glob)-5 b(al)25 b(envir)-5 b(onment)p Fp(.)39 b(This)19 -b(en)m(vironmen)m(t,)j(whic)m(h)e(k)m(eeps)h(all)f(global)0 -407 y(v)-5 b(ariables)26 b(and)h(functions,)g(is)g(initialized)d(at)29 -b(the)e(b)s(eginning)e(of)j(the)g(em)m(b)s(edding)e(program)h(and)g(p)s -(ersists)f(un)m(til)0 520 y(its)k(end.)141 633 y(The)e(global)g(en)m -(vironmen)m(t)g(can)h(b)s(e)f(manipulated)e(b)m(y)i(Lua)g(co)s(de)h(or) -g(b)m(y)f(the)h(em)m(b)s(edding)d(program,)j(whic)m(h)0 -746 y(can)i(read)f(and)g(write)f(global)h(v)-5 b(ariables)29 -b(using)g(functions)g(in)g(the)h(library)e(that)j(implemen)m(ts)e(Lua.) -141 859 y(Global)d(v)-5 b(ariables)26 b(do)h(not)h(need)e(declaration.) -40 b(An)m(y)27 b(v)-5 b(ariable)26 b(is)g(assumed)g(to)i(b)s(e)f -(global)f(unless)f(explicitly)0 972 y(declared)30 b(lo)s(cal)f(\(see)j -(Section)e(4.4.5\).)43 b(Before)31 b(the)g(\014rst)e(assignmen)m(t,)i -(the)f(v)-5 b(alue)30 b(of)h(a)g(global)e(v)-5 b(ariable)29 -b(is)h Fm(nil)p Fp(.)141 1085 y(The)g(unit)f(of)h(execution)h(of)g(Lua) -f(is)f(called)h(a)g Fo(chunk)p Fp(.)41 b(The)30 b(syn)m(tax)2484 -1052 y Fl(1)2554 1085 y Fp(for)g(c)m(h)m(unks)g(is:)167 -1229 y Fo(chunk)100 b Fk(!)f(f)p Fo(statement)67 b Fk(j)33 -b Fo(function)7 b Fk(g)33 b Fp([)p Fo(r)-5 b(et)9 b Fp(])0 -1373 y(A)28 b(c)m(h)m(unk)g(ma)m(y)g(con)m(tain)h(statemen)m(ts)g(and)f -(function)f(de\014nitions,)f(and)h(ma)m(y)i(b)s(e)e(in)g(a)h(\014le)f -(or)h(in)f(a)h(string)f(inside)0 1486 y(the)g(host)f(program.)39 -b(A)27 b(c)m(h)m(unk)f(ma)m(y)h(optionally)d(ends)i(with)f(a)i(return)e -(statemen)m(t)j(\(see)f(Section)g(4.4.3\).)41 b(When)0 -1599 y(a)c(c)m(h)m(unk)f(is)g(executed,)j(\014rst)d(all)f(its)h -(functions)f(and)h(statemen)m(ts)i(are)f(compiled,)f(then)h(the)f -(statemen)m(ts)j(are)0 1712 y(executed)c(in)e(sequen)m(tial)h(order.)53 -b(All)33 b(mo)s(di\014cations)f(a)j(c)m(h)m(unk)f(e\013ects)i(on)e(the) -h(global)f(en)m(vironmen)m(t)g(p)s(ersist)0 1825 y(after)d(its)f(end.) -40 b(Those)30 b(include)e(mo)s(di\014cations)h(to)i(global)e(v)-5 -b(ariables)29 b(and)h(de\014nitions)e(of)j(new)f(functions)3715 -1792 y Fl(2)3753 1825 y Fp(.)141 1938 y(Ch)m(unks)k(ma)m(y)i(b)s(e)f -(pre-compiled;)h(see)g(program)f Fn(luac)f Fp(for)h(details.)55 -b(T)-8 b(ext)36 b(\014les)e(with)g(c)m(h)m(unks)h(and)g(their)0 -2051 y(binary)g(pre-compiled)f(forms)i(are)g(in)m(terc)m(hangeable.)59 -b(Lua)36 b(automatically)g(detects)i(the)e(\014le)g(t)m(yp)s(e)g(and)g -(acts)0 2163 y(accordingly)-8 b(.)0 2450 y Fq(3)135 b(T)l(yp)t(es)0 -2653 y Fp(Lua)27 b(is)f(a)i(dynamically)d(t)m(yp)s(ed)i(language.)40 -b(V)-8 b(ariables)27 b(do)g(not)h(ha)m(v)m(e)g(t)m(yp)s(es;)h(only)d(v) --5 b(alues)27 b(do.)39 b(All)26 b(v)-5 b(alues)27 b(carry)0 -2766 y(their)i(o)m(wn)i(t)m(yp)s(e.)41 b(Therefore,)30 -b(there)h(are)f(no)h(t)m(yp)s(e)f(de\014nitions)e(in)h(the)i(language.) -141 2879 y(There)39 b(are)h(sev)m(en)f(basic)g(t)m(yp)s(es)g(in)f(Lua:) -58 b Fo(nil)p Fp(,)42 b Fo(numb)-5 b(er)p Fp(,)42 b Fo(string)p -Fp(,)h Fo(function)p Fp(,)e Fo(CF)-7 b(unction)p Fp(,)43 -b Fo(user)-5 b(data)p Fp(,)44 b(and)0 2992 y Fo(table)p -Fp(.)d Fo(Nil)28 b Fp(is)h(the)g(t)m(yp)s(e)g(of)g(the)h(v)-5 -b(alue)28 b Fm(nil)p Fp(,)i(whose)f(main)f(prop)s(ert)m(y)g(is)g(to)i -(b)s(e)e(di\013eren)m(t)h(from)f(an)m(y)i(other)f(v)-5 -b(alue.)0 3104 y Fo(Numb)g(er)30 b Fp(represen)m(ts)h(real)f -(\(\015oating)g(p)s(oin)m(t\))g(n)m(um)m(b)s(ers,)f(while)g -Fo(string)h Fp(has)g(the)h(usual)e(meaning.)141 3217 -y(F)-8 b(unctions)39 b(are)i(considered)d(\014rst-class)i(v)-5 -b(alues)39 b(in)f(Lua.)69 b(This)38 b(means)i(that)g(functions)f(can)h -(b)s(e)f(stored)0 3330 y(in)33 b(v)-5 b(ariables,)34 -b(passed)g(as)h(argumen)m(ts)f(to)h(other)g(functions)e(and)g(returned) -g(as)i(results.)51 b(When)34 b(a)h(function)e(is)0 3443 -y(de\014ned)28 b(in)h(Lua,)g(its)g(b)s(o)s(dy)f(is)h(compiled)f(and)h -(stored)g(in)f(a)i(giv)m(en)g(v)-5 b(ariable.)39 b(Lua)29 -b(can)h(call)f(\(and)g(manipulate\))0 3556 y(functions)g(written)g(in)g -(Lua)h(and)g(functions)f(written)h(in)f(C;)h(the)g(latter)h(ha)m(v)m(e) -h(t)m(yp)s(e)e Fo(CF)-7 b(unction)7 b Fp(.)141 3669 y(The)35 -b(t)m(yp)s(e)g Fo(user)-5 b(data)37 b Fp(is)d(pro)m(vided)g(to)i(allo)m -(w)e(arbitrary)g(C)h(p)s(oin)m(ters)e(to)j(b)s(e)f(stored)g(in)f(Lua)g -(v)-5 b(ariables.)54 b(It)0 3782 y(corresp)s(onds)33 -b(to)j Fn(void*)d Fp(and)h(has)g(no)h(pre-de\014ned)e(op)s(erations)h -(in)f(Lua,)j(b)s(esides)d(assignmen)m(t)h(and)g(equalit)m(y)0 -3895 y(test.)50 b(Ho)m(w)m(ev)m(er,)37 b(b)m(y)c(using)f(fallbac)m(ks,) -h(the)h(programmer)f(ma)m(y)h(de\014ne)e(op)s(erations)h(for)g -Fo(user)-5 b(data)35 b Fp(v)-5 b(alues;)34 b(see)0 4008 -y(Section)c(4.7.)141 4121 y(The)e(t)m(yp)s(e)g Fo(table)h -Fp(implemen)m(ts)e(asso)s(ciativ)m(e)i(arra)m(ys,)g(that)g(is,)f(arra)m -(ys)h(that)g(can)g(b)s(e)e(indexed)g(not)i(only)e(with)0 -4234 y(n)m(um)m(b)s(ers,)j(but)g(with)f(an)m(y)i(v)-5 -b(alue)31 b(\(except)h Fm(nil)p Fp(\).)42 b(Therefore,)31 -b(this)f(t)m(yp)s(e)h(ma)m(y)g(b)s(e)f(used)g(not)h(only)f(to)i -(represen)m(t)0 4346 y(ordinary)c(arra)m(ys,)j(but)f(also)g(sym)m(b)s -(ol)f(tables,)h(sets,)h(records,)f(etc.)42 b(T)-8 b(o)30 -b(represen)m(t)g(records,)g(Lua)g(uses)g(the)g(\014eld)0 -4459 y(name)38 b(as)h(an)f(index.)62 b(The)38 b(language)g(supp)s(orts) -f(this)g(represen)m(tation)h(b)m(y)g(pro)m(viding)e Fn(a.name)h -Fp(as)h(syn)m(tactic)0 4572 y(sugar)i(for)f Fn(a["name"])p -Fp(.)67 b(T)-8 b(ables)40 b(ma)m(y)g(also)g(carry)g(metho)s(ds.)68 -b(Because)42 b(functions)c(are)j(\014rst)e(class)g(v)-5 -b(alues,)0 4685 y(table)33 b(\014elds)f(ma)m(y)i(con)m(tain)g -(functions.)48 b(The)33 b(form)g Fn(t:f\(x\))e Fp(is)i(syn)m(tactic)h -(sugar)f(for)h Fn(t.f\(t,x\))p Fp(,)e(whic)m(h)g(calls)0 -4798 y(the)f(metho)s(d)e Fn(f)h Fp(from)g(the)h(table)f -Fn(t)g Fp(passing)f(itself)h(as)g(the)h(\014rst)e(parameter.)141 -4911 y(It)23 b(is)f(imp)s(ortan)m(t)h(to)g(notice)h(that)f(tables)g -(are)h(ob)5 b(jects,)25 b(and)e(not)g(v)-5 b(alues.)38 -b(V)-8 b(ariables)22 b(cannot)i(con)m(tain)f(tables,)0 -5024 y(only)28 b(references)i(to)g(them.)41 b(Assignmen)m(t,)29 -b(parameter)h(passing)e(and)h(returns)f(alw)m(a)m(ys)i(manipulate)e -(references)p 0 5103 1560 4 v 104 5157 a Fj(1)138 5189 -y Fi(As)e(usual,)g Fh(f)p Fg(a)6 b Fh(g)26 b Fi(means)g(0)g(or)g(more)f -Fg(a)6 b Fi('s,)26 b([)p Fg(a)6 b Fi(])27 b(means)e(an)h(optional)g -Fg(a)g Fi(and)f Fh(f)p Fg(a)6 b Fh(g)2439 5157 y Fj(+)2517 -5189 y Fi(means)25 b(one)h(or)g(more)f Fg(a)6 b Fi('s.)104 -5248 y Fj(2)138 5280 y Fi(Actually)-6 b(,)26 b(a)g(function)f -(de\014nition)h(is)g(an)g(assignmen)n(t)f(to)h(a)g(global)h(v)l -(ariable;)g(see)f(Section)g(3.)1927 5589 y Fp(2)p eop -%%Page: 3 3 -3 2 bop 0 91 a Fp(to)35 b(tables,)g(and)e(do)h(not)h(imply)d(an)m(y)i -(kind)e(of)j(cop)m(y)-8 b(.)53 b(Moreo)m(v)m(er,)37 b(tables)d(m)m(ust) -g(b)s(e)f(explicitly)f(created)j(b)s(efore)0 204 y(used)30 -b(\(see)h(Section)f(4.5.7\).)0 489 y Fq(4)135 b(The)44 -b(Language)0 692 y Fp(This)29 b(section)h(describ)s(es)f(the)h(lexis,)g -(the)g(syn)m(tax)h(and)f(the)g(seman)m(tics)h(of)g(Lua.)0 -934 y Ff(4.1)112 b(Lexical)37 b(Con)m(v)m(en)m(tions)0 -1105 y Fp(Lua)e(is)g(a)h(case)g(sensitiv)m(e)f(language.)56 -b(Iden)m(ti\014ers)34 b(can)i(b)s(e)f(an)m(y)h(string)e(of)i(letters,)h -(digits,)f(and)f(underscores,)0 1218 y(not)c(b)s(eginning)c(with)i(a)i -(digit.)40 b(The)29 b(follo)m(wing)g(w)m(ords)h(are)h(reserv)m(ed,)g -(and)e(cannot)i(b)s(e)f(used)g(as)g(iden)m(ti\014ers:)286 -1397 y Fn(and)334 b(do)381 b(else)285 b(elseif)286 1510 -y(end)334 b(function)93 b(if)381 b(local)286 1623 y(nil)334 -b(not)f(or)381 b(repeat)286 1736 y(return)190 b(then)285 -b(until)237 b(while)141 1914 y Fp(The)30 b(follo)m(wing)f(strings)g -(denote)i(other)g(tok)m(ens:)430 2093 y Fn(~=)94 b(<=)h(>=)g(<)143 -b(>)g(==)95 b(=)143 b(..)95 b(+)143 b(-)g(*)g(/)430 2206 -y(\045)f(\()h(\))g({)g(})g([)g(])g(;)g(,)g(.)141 2385 -y Fp(Literal)44 b(strings)f(can)h(b)s(e)g(delimited)e(b)m(y)i(matc)m -(hing)h(single)e(or)h(double)f(quotes,)49 b(and)43 b(can)i(con)m(tain)g -(the)0 2498 y(C-lik)m(e)35 b(escap)s(e)h(sequences)g -Fn('\\n')p Fp(,)g Fn('\\t')e Fp(and)h Fn('\\r')p Fp(.)56 -b(Literal)34 b(strings)h(can)h(also)f(b)s(e)g(delimited)e(b)m(y)j(matc) -m(hing)0 2610 y Fn([[)47 b(...)g(]])p Fp(.)38 b(Literals)21 -b(in)h(this)f(brac)m(k)m(eted)j(form)f(ma)m(y)g(run)e(for)i(sev)m(eral) -g(lines,)f(ma)m(y)i(con)m(tain)f(nested)f Fn([[)48 b(...)f(]])0 -2723 y Fp(pairs,)29 b(and)h(do)g(not)h(in)m(terpret)f(escap)s(e)h -(sequences.)141 2836 y(Commen)m(ts)f(start)g(an)m(ywhere)f(outside)g(a) -h(string)e(with)h(a)h(double)e(h)m(yphen)g(\()p Fn(--)p -Fp(\))h(and)g(run)f(un)m(til)g(the)i(end)f(of)0 2949 -y(the)i(line.)39 b(Moreo)m(v)m(er,)32 b(if)e(the)g(\014rst)g(line)f(of) -h(a)h(c)m(h)m(unk)f(\014le)g(starts)g(with)f Fn(#)p Fp(,)i(this)e(line) -g(is)g(skipp)s(ed)3289 2916 y Fl(3)3326 2949 y Fp(.)141 -3062 y(Numerical)35 b(constan)m(ts)j(ma)m(y)e(b)s(e)g(written)f(with)g -(an)h(optional)g(decimal)f(part,)j(and)d(an)i(optional)e(decimal)0 -3175 y(exp)s(onen)m(t.)41 b(Examples)29 b(of)i(v)-5 b(alid)28 -b(n)m(umerical)h(constan)m(ts)j(are:)334 3354 y Fn(4)238 -b(4.0)g(0.4)g(4.57e-3)f(0.3e12)0 3595 y Ff(4.2)112 b(Co)s(ercion)0 -3767 y Fp(Lua)37 b(pro)m(vides)f(some)h(automatic)h(con)m(v)m(ersions.) -60 b(An)m(y)37 b(arithmetic)g(op)s(eration)f(applied)f(to)j(a)f(string) -f(tries)g(to)0 3880 y(con)m(v)m(ert)c(that)e(string)f(to)i(a)g(n)m(um)m -(b)s(er,)e(follo)m(wing)f(the)j(usual)d(rules.)40 b(Con)m(v)m(ersely)-8 -b(,)30 b(whenev)m(er)g(a)h(n)m(um)m(b)s(er)e(is)g(used)0 -3993 y(when)g(a)i(string)e(is)h(exp)s(ected,)h(that)g(n)m(um)m(b)s(er)e -(is)g(con)m(v)m(erted)j(to)f(a)g(string,)f(according)g(to)h(the)g -(follo)m(wing)e(rule:)39 b(if)0 4106 y(the)26 b(n)m(um)m(b)s(er)e(is)h -(an)g(in)m(teger,)i(it)e(is)g(written)g(without)f(exp)s(onen)m(t)i(or)f -(decimal)g(p)s(oin)m(t;)h(otherwise,)h(it)e(is)f(formatted)0 -4219 y(follo)m(wing)29 b(the)h Fn(\045g)g Fp(con)m(v)m(ersion)h(sp)s -(eci\014cation)e(of)i(the)f Fn(printf)f Fp(function)g(in)g(the)h -(standard)g(C)g(library)-8 b(.)0 4460 y Ff(4.3)112 b(Adjustmen)m(t)0 -4632 y Fp(F)-8 b(unctions)28 b(in)f(Lua)h(can)g(return)f(man)m(y)i(v)-5 -b(alues.)39 b(Because)30 b(there)e(are)h(no)f(t)m(yp)s(e)g -(declarations,)g(the)h(system)f(do)s(es)0 4745 y(not)36 -b(kno)m(w)f(ho)m(w)g(man)m(y)h(v)-5 b(alues)35 b(a)g(function)f(will)f -(return,)j(or)f(ho)m(w)h(man)m(y)f(parameters)h(it)f(needs.)55 -b(Therefore,)0 4858 y(sometimes,)26 b(a)g(list)e(of)h(v)-5 -b(alues)24 b(m)m(ust)h(b)s(e)g Fo(adjuste)-5 b(d)9 b -Fp(,)28 b(at)e(run)e(time,)i(to)g(a)f(giv)m(en)g(length.)39 -b(If)24 b(there)i(are)f(more)h(v)-5 b(alues)0 4971 y(than)33 -b(are)g(needed,)g(then)g(the)g(last)f(v)-5 b(alues)33 -b(are)g(thro)m(wn)f(a)m(w)m(a)m(y)-8 b(.)51 b(If)32 b(there)h(are)g -(more)g(needs)g(than)f(v)-5 b(alues,)33 b(then)0 5084 -y(the)g(list)e(is)g(extended)h(with)f(as)i(man)m(y)g -Fm(nil)p Fp('s)f(as)h(needed.)46 b(Adjustmen)m(t)32 b(o)s(ccurs)g(in)f -(m)m(ultiple)f(assignmen)m(t)j(and)0 5197 y(function)c(calls.)p -0 5254 1560 4 v 104 5308 a Fj(3)138 5340 y Fi(This)e(facilit)n(y)f -(allo)n(ws)i(the)d(use)h(of)h(Lua)e(as)i(a)f(script)f(in)n(terpreter)h -(in)f(Unix)g(systems.)1927 5589 y Fp(3)p eop -%%Page: 4 4 -4 3 bop 0 91 a Ff(4.4)112 b(Statemen)m(ts)0 263 y Fp(Lua)35 -b(supp)s(orts)f(an)i(almost)f(con)m(v)m(en)m(tional)i(set)f(of)g -(statemen)m(ts.)58 b(The)35 b(con)m(v)m(en)m(tional)i(commands)e -(include)e(as-)0 376 y(signmen)m(t,)h(con)m(trol)h(structures)e(and)g -(pro)s(cedure)g(calls.)50 b(Non-con)m(v)m(en)m(tional)35 -b(commands)f(include)e(table)h(con-)0 489 y(structors)d(\(Section)h -(4.5.7\),)i(and)c(lo)s(cal)h(v)-5 b(ariable)29 b(declarations)h -(\(Section)h(4.4.5\).)0 729 y Fm(4.4.1)105 b(Blo)s(c)m(ks)0 -901 y Fp(A)36 b(blo)s(c)m(k)g(is)f(a)h(list)f(of)h(statemen)m(ts,)k -(whic)m(h)35 b(is)g(executed)i(sequen)m(tially)-8 b(.)57 -b(An)m(y)36 b(statemen)m(t)i(can)e(b)s(e)g(optionally)0 -1013 y(follo)m(w)m(ed)30 b(b)m(y)g(a)h(semicolon:)167 -1150 y Fo(blo)-5 b(ck)100 b Fk(!)g(f)p Fo(stat)34 b(sc)5 -b Fk(g)33 b Fp([)p Fo(r)-5 b(et)9 b Fp(])279 1263 y Fo(sc)99 -b Fk(!)h Fp([';'])0 1399 y(F)-8 b(or)38 b(syn)m(tactic)g(reasons,)h(a)e -Fn(return)f Fp(statemen)m(t)i(can)g(only)e(b)s(e)g(written)g(as)i(the)f -(last)g(statemen)m(t)i(of)e(a)g(blo)s(c)m(k.)0 1512 y(This)29 -b(restriction)g(also)h(a)m(v)m(oids)h(some)g(\\statemen)m(t)h(not)f -(reac)m(hed")h(errors.)0 1752 y Fm(4.4.2)105 b(Assignmen)m(t)0 -1924 y Fp(The)34 b(language)g(allo)m(ws)f(m)m(ultiple)f(assignmen)m(t.) -52 b(Therefore,)35 b(the)f(syn)m(tax)h(de\014nes)e(a)h(list)f(of)h(v)-5 -b(ariables)33 b(on)h(the)0 2037 y(left)i(side,)h(and)e(a)i(list)e(of)h -(expressions)f(on)h(the)h(righ)m(t)e(side.)58 b(Both)36 -b(lists)f(ha)m(v)m(e)j(their)d(elemen)m(ts)h(separated)h(b)m(y)0 -2150 y(commas:)315 2268 y Fo(stat)100 b Fk(!)g Fo(varlist1)34 -b Fp('=')f Fo(explist1)167 2381 y(varlist1)101 b Fk(!)f -Fo(var)33 b Fk(f)p Fp(',')h Fo(var)10 b Fk(g)0 2518 y -Fp(This)27 b(statemen)m(t)k(\014rst)d(ev)-5 b(aluates)30 -b(all)e(v)-5 b(alues)28 b(on)h(the)g(righ)m(t)f(side)g(and)h(ev)m(en)m -(tual)g(indices)e(on)i(the)g(left)g(side,)g(and)0 2631 -y(then)h(mak)m(es)h(the)g(assignmen)m(ts.)40 b(Therefore,)31 -b(it)f(can)g(b)s(e)g(used)g(to)h(exc)m(hange)h(t)m(w)m(o)f(v)-5 -b(alues,)30 b(as)h(in)143 2818 y Fn(x,)47 b(y)h(=)f(y,)g(x)0 -3006 y Fp(Before)f(the)f(assignmen)m(t,)k(the)c(list)e(of)i(v)-5 -b(alues)44 b(is)g Fo(adjuste)-5 b(d)47 b Fp(to)e(the)g(length)g(of)g -(the)g(list)e(of)i(v)-5 b(ariables)44 b(\(see)0 3119 -y(Section)30 b(4.3\).)141 3232 y(A)h(single)e(name)h(can)h(denote)g(a)f -(global)g(or)g(a)h(lo)s(cal)f(v)-5 b(ariable,)29 b(or)i(a)f(formal)g -(parameter:)167 3376 y Fo(var)100 b Fk(!)g Fo(name)0 -3520 y Fp(Square)30 b(brac)m(k)m(ets)i(are)e(used)g(to)h(index)e(a)i -(table:)167 3665 y Fo(var)100 b Fk(!)g Fo(var)33 b Fp('[')g -Fo(exp1)h Fp(']')0 3809 y(If)i Fn(var)f Fp(results)g(in)f(a)j(table)f -(v)-5 b(alue,)37 b(the)g(\014eld)d(indexed)h(b)m(y)h(the)g(expression)f -(v)-5 b(alue)35 b(gets)j(the)e(assigned)f(v)-5 b(alue.)0 -3922 y(Otherwise,)41 b(the)e(fallbac)m(k)g Fo(settable)h -Fp(is)e(called,)k(with)c(three)h(parameters:)59 b(the)40 -b(v)-5 b(alue)39 b(of)g Fn(var)p Fp(,)i(the)f(v)-5 b(alue)39 -b(of)0 4035 y(expression,)29 b(and)h(the)h(v)-5 b(alue)30 -b(b)s(eing)f(assigned)g(to)i(it;)f(see)h(Section)g(4.7.)141 -4148 y(The)f(syn)m(tax)h Fn(var.NAME)d Fp(is)h(just)h(syn)m(tactic)i -(sugar)e(for)g Fn(var["NAME"])p Fp(.)167 4292 y Fo(var)100 -b Fk(!)g Fo(var)33 b Fp('.')43 b Fo(name)0 4563 y Fm(4.4.3)105 -b(Con)m(trol)35 b(Structures)0 4735 y Fp(The)30 b(condition)f -(expression)h(of)h(a)g(con)m(trol)g(structure)f(can)h(return)e(an)m(y)i -(v)-5 b(alue.)41 b(All)30 b(v)-5 b(alues)30 b(di\013eren)m(t)g(from)g -Fm(nil)0 4848 y Fp(are)h(considered)e(true;)h Fm(nil)h -Fp(is)e(considered)g(false.)41 b Fn(if)p Fp('s,)30 b -Fn(while)p Fp('s)f(and)h Fn(repeat)p Fp('s)f(ha)m(v)m(e)i(the)g(usual)e -(meaning.)223 4987 y Fo(stat)101 b Fk(!)e Fm(while)32 -b Fo(exp1)i Fm(do)f Fo(blo)-5 b(ck)33 b Fm(end)574 5099 -y Fk(j)65 b Fm(rep)s(eat)32 b Fo(blo)-5 b(ck)33 b Fm(un)m(til)f -Fo(exp1)574 5212 y Fk(j)65 b Fm(if)32 b Fo(exp1)i Fm(then)e -Fo(blo)-5 b(ck)33 b Fk(f)p Fo(elseif)20 b Fk(g)33 b Fp([)p -Fm(else)f Fo(blo)-5 b(ck)10 b Fp(])34 b Fm(end)167 5325 -y Fo(elseif)100 b Fk(!)f Fm(elseif)33 b Fo(exp1)g Fm(then)g -Fo(blo)-5 b(ck)1927 5589 y Fp(4)p eop -%%Page: 5 5 -5 4 bop 141 204 a Fp(A)32 b Fn(return)e Fp(is)h(used)g(to)h(return)f(v) --5 b(alues)31 b(from)g(a)h(function)f(or)g(a)h(c)m(h)m(unk.)45 -b(Because)33 b(they)f(ma)m(y)g(return)f(more)0 317 y(than)f(one)h(v)-5 -b(alue,)30 b(the)g(syn)m(tax)h(for)g(a)f(return)g(statemen)m(t)i(is:) -167 461 y Fo(r)-5 b(et)101 b Fk(!)e Fm(return)32 b Fo(explist)i -Fp([)p Fo(sc)5 b Fp(])0 846 y Fm(4.4.4)105 b(F)-9 b(unction)36 -b(Calls)f(as)f(Statemen)m(ts)0 1017 y Fp(Because)e(of)e(p)s(ossible)e -(side-e\013ects,)k(function)d(calls)g(can)i(b)s(e)f(executed)h(as)f -(statemen)m(ts:)167 1162 y Fo(stat)101 b Fk(!)e Fo(functionc)-5 -b(al)5 b(l)0 1306 y Fp(Ev)m(en)m(tual)31 b(returned)e(v)-5 -b(alues)29 b(are)i(thro)m(wn)f(a)m(w)m(a)m(y)-8 b(.)43 -b(F)-8 b(unction)30 b(calls)g(are)g(explained)f(in)g(Section)h(4.5.8.)0 -1546 y Fm(4.4.5)105 b(Lo)s(cal)36 b(Declarations)0 1718 -y Fp(Lo)s(cal)c(v)-5 b(ariables)31 b(can)h(b)s(e)g(declared)g(an)m -(ywhere)g(inside)e(a)i(blo)s(c)m(k.)46 b(Their)30 b(scop)s(e)j(b)s -(egins)d(after)j(the)f(declaration)0 1830 y(and)e(lasts)g(un)m(til)e -(the)j(end)f(of)g(the)h(blo)s(c)m(k.)40 b(The)30 b(declaration)g(ma)m -(y)h(include)d(an)i(initial)e(assignmen)m(t:)267 1967 -y Fo(stat)101 b Fk(!)e Fm(lo)s(cal)33 b Fo(de)-5 b(clist)34 -b Fp([)p Fo(init)9 b Fp(])167 2080 y Fo(de)-5 b(clist)101 -b Fk(!)e Fo(name)34 b Fk(f)p Fp(',')f Fo(name)7 b Fk(g)274 -2193 y Fo(init)100 b Fk(!)f Fp('=')33 b Fo(explist1)0 -2329 y Fp(If)h(presen)m(t,)h(an)f(initial)d(assignmen)m(t)j(has)g(the)g -(same)h(seman)m(tics)f(of)g(a)h(m)m(ultiple)c(assignmen)m(t.)52 -b(Otherwise,)34 b(all)0 2442 y(v)-5 b(ariables)29 b(are)i(initialized)c -(with)i Fm(nil)p Fp(.)0 2686 y Ff(4.5)112 b(Expressions)0 -2857 y Fm(4.5.1)105 b(Simple)35 b(Expressions)0 3029 -y Fp(Simple)28 b(expressions)h(are:)167 3165 y Fo(exp)100 -b Fk(!)g Fp('\(')33 b Fo(exp)g Fp('\)')167 3278 y Fo(exp)100 -b Fk(!)g Fm(nil)167 3391 y Fo(exp)g Fk(!)g Fp('n)m(um)m(b)s(er')167 -3504 y Fo(exp)g Fk(!)g Fp('literal')167 3617 y Fo(exp)g -Fk(!)g Fo(var)0 3758 y Fp(Num)m(b)s(ers)44 b(\(n)m(umerical)g(constan)m -(ts\))j(and)e(string)f(literals)f(are)j(explained)d(in)h(Section)h -(4.1.)87 b(V)-8 b(ariables)45 b(are)0 3871 y(explained)29 -b(in)g(Section)h(4.4.2.)0 4111 y Fm(4.5.2)105 b(Arithmetic)34 -b(Op)s(erators)0 4283 y Fp(Lua)41 b(supp)s(orts)e(the)i(usual)f -(arithmetic)g(op)s(erators.)73 b(These)41 b(op)s(erators)g(are)h(the)f -(binary)e Fn(+)p Fp(,)44 b Fn(-)p Fp(,)f Fn(*)p Fp(,)h -Fn(/)d Fp(and)f Fn(^)0 4396 y Fp(\(exp)s(onen)m(tiation\),)32 -b(and)g(the)g(unary)e Fn(-)p Fp(.)45 b(If)32 b(the)g(op)s(erands)e(are) -i(n)m(um)m(b)s(ers,)f(or)h(strings)f(that)h(can)g(b)s(e)f(con)m(v)m -(erted)0 4509 y(to)26 b(n)m(um)m(b)s(ers,)f(according)h(to)g(the)g -(rules)e(giv)m(en)h(in)f(Section)h(4.2,)j(then)d(all)g(op)s(erations)f -(but)h(exp)s(onen)m(tiation)g(ha)m(v)m(e)0 4622 y(the)33 -b(usual)e(meaning.)47 b(Otherwise,)33 b(the)g(fallbac)m(k)f(\\arith")h -(is)f(called)g(\(see)h(Section)g(4.7\).)49 b(An)33 b(exp)s(onen)m -(tiation)0 4735 y(alw)m(a)m(ys)39 b(calls)f(this)f(fallbac)m(k.)65 -b(The)38 b(standard)f(mathematical)i(library)d(rede\014nes)i(this)f -(fallbac)m(k,)j(giving)e(the)0 4848 y(exp)s(ected)31 -b(meaning)e(to)j(exp)s(onen)m(tiation)d(\(see)j(Section)e(6.3\).)0 -5088 y Fm(4.5.3)105 b(Relational)35 b(Op)s(erators)0 -5259 y Fp(Lua)30 b(pro)m(vides)f(the)i(follo)m(wing)e(relational)g(op)s -(erators:)1927 5589 y(5)p eop -%%Page: 6 6 -6 5 bop 334 91 a Fn(<)143 b(>)g(<=)95 b(>=)g(~=)g(==)0 -279 y Fp(All)29 b(these)i(return)e Fm(nil)i Fp(as)f(false)g(and)g(a)h -(v)-5 b(alue)30 b(di\013eren)m(t)f(from)h Fm(nil)h Fp(\(actually)f(the) -h(n)m(um)m(b)s(er)e(1\))i(as)f(true.)141 392 y(Equalit)m(y)k(\014rst)f -(compares)i(the)g(t)m(yp)s(es)f(of)h(its)e(op)s(erands.)52 -b(If)34 b(they)g(are)h(di\013eren)m(t,)g(then)f(the)h(result)e(is)h -Fm(nil)p Fp(.)0 505 y(Otherwise,)25 b(their)g(v)-5 b(alues)24 -b(are)i(compared.)39 b(Num)m(b)s(ers)24 b(and)h(strings)f(are)i -(compared)f(in)f(the)i(usual)e(w)m(a)m(y)-8 b(.)40 b(T)-8 -b(ables,)0 618 y(CF)g(unctions,)28 b(and)g(functions)e(are)j(compared)f -(b)m(y)g(reference,)h(that)g(is,)f(t)m(w)m(o)i(tables)e(are)g -(considered)f(equal)h(only)0 731 y(if)h(they)i(are)g(the)f(same)h -(table.)41 b(The)29 b(op)s(erator)i Fn(~=)f Fp(is)f(exactly)i(the)g -(negation)g(of)f(equalit)m(y)g(\()p Fn(==)p Fp(\).)141 -844 y(The)h(other)i(op)s(erators)f(w)m(ork)g(as)g(follo)m(ws.)44 -b(If)31 b(b)s(oth)h(argumen)m(ts)g(are)g(n)m(um)m(b)s(ers,)f(then)h -(they)g(are)g(compared)0 956 y(as)c(suc)m(h.)39 b(Otherwise,)27 -b(if)f(b)s(oth)h(argumen)m(ts)g(can)h(b)s(e)f(con)m(v)m(erted)h(to)g -(strings,)f(their)g(v)-5 b(alues)26 b(are)i(compared)f(using)0 -1069 y(lexicographical)i(order.)40 b(Otherwise,)29 b(the)i(\\order")g -(fallbac)m(k)f(is)f(called)h(\(see)h(Section)f(4.7\).)0 -1309 y Fm(4.5.4)105 b(Logical)36 b(Op)s(erators)0 1481 -y Fp(Lik)m(e)g(con)m(trol)g(structures,)g(all)f(logical)g(op)s(erators) -h(consider)f Fm(nil)h Fp(as)g(false)f(and)g(an)m(ything)g(else)h(as)g -(true.)56 b(The)0 1594 y(logical)30 b(op)s(erators)g(are:)620 -1782 y Fn(and)143 b(or)f(not)0 1969 y Fp(The)31 b(op)s(erator)g -Fn(and)f Fp(returns)g Fm(nil)i Fp(if)e(its)g(\014rst)h(argumen)m(t)g -(is)f Fm(nil)p Fp(;)i(otherwise)f(it)g(returns)e(its)i(second)g -(argumen)m(t.)0 2082 y(The)d(op)s(erator)h Fn(or)g Fp(returns)e(its)i -(\014rst)f(argumen)m(t)h(if)f(it)g(is)g(di\013eren)m(t)g(from)h -Fm(nil)p Fp(;)g(otherwise)g(it)f(returns)g(its)g(second)0 -2195 y(argumen)m(t.)40 b(Both)29 b Fn(and)e Fp(and)g -Fn(or)g Fp(use)h(short-cut)g(ev)-5 b(aluation,)28 b(that)h(is,)e(the)h -(second)g(op)s(erand)f(is)g(ev)-5 b(aluated)28 b(only)0 -2308 y(if)h(necessary)-8 b(.)0 2548 y Fm(4.5.5)105 b(Concatenation)0 -2720 y Fp(Lua)33 b(o\013ers)h(a)g(string)e(concatenation)j(op)s -(erator,)g(denoted)f(b)m(y)f(\\)p Fn(..)p Fp(".)50 b(If)33 -b(op)s(erands)f(are)i(strings)f(or)g(n)m(um)m(b)s(ers,)0 -2833 y(then)j(they)g(are)h(con)m(v)m(erted)h(to)f(strings)e(according)h -(to)h(the)f(rules)f(in)g(Section)h(4.2.)59 b(Otherwise,)37 -b(the)f(fallbac)m(k)0 2946 y(\\concat")d(is)c(called)h(\(see)h(Section) -f(4.7\).)0 3186 y Fm(4.5.6)105 b(Precedence)0 3357 y -Fp(Op)s(erator)30 b(precedence)h(follo)m(ws)e(the)i(table)f(b)s(elo)m -(w,)g(from)g(the)g(lo)m(w)m(er)h(to)g(the)g(higher)e(priorit)m(y:)620 -3545 y Fn(and)143 b(or)620 3658 y(<)g(>)g(<=)95 b(>=)g(~=)g(==)620 -3771 y(..)620 3884 y(+)143 b(-)620 3997 y(*)g(/)620 4109 -y(not)95 b(-)48 b(\(unary\))620 4222 y(^)0 4410 y Fp(All)29 -b(binary)g(op)s(erators)h(are)h(left)f(asso)s(ciativ)m(e,)h(except)h -(for)e Fn(^)g Fp(\(exp)s(onen)m(tiation\),)g(whic)m(h)g(is)f(righ)m(t)h -(asso)s(ciativ)m(e.)0 4650 y Fm(4.5.7)105 b(T)-9 b(able)35 -b(Constructors)0 4822 y Fp(T)-8 b(able)30 b(constructors)g(are)g -(expressions)f(that)i(create)g(tables;)f(ev)m(ery)h(time)f(a)g -(constructor)g(is)g(ev)-5 b(aluated,)30 b(a)g(new)0 4935 -y(table)c(is)f(created.)41 b(Constructors)26 b(can)g(b)s(e)g(used)f(to) -i(create)h(empt)m(y)f(tables,)g(or)f(to)h(create)h(a)f(table)f(and)g -(initialize)0 5048 y(some)31 b(\014elds.)141 5160 y(The)f(general)g -(syn)m(tax)h(for)f(constructors)h(is:)1927 5589 y(6)p -eop -%%Page: 7 7 -7 6 bop 167 79 a Fo(table)-5 b(c)g(onstructor)103 b Fk(!)c -Fp(')p Fk(f)p Fp(')34 b Fo(\014eld)5 b(list)33 b Fp(')p -Fk(g)p Fp(')506 192 y Fo(\014eld)5 b(list)101 b Fk(!)e -Fo(l\014eld)5 b(list)66 b Fk(j)33 b Fo(\016eld)5 b(list)66 -b Fk(j)33 b Fo(l\014eld)5 b(list)33 b Fp(';')h Fo(\016eld)5 -b(list)483 305 y(l\014eld)g(list)101 b Fk(!)e Fp([)p -Fo(l\014eld)5 b(list1)12 b Fp(])477 418 y Fo(\016eld)5 -b(list)101 b Fk(!)e Fp([)p Fo(\016eld)5 b(list1)12 b -Fp(])141 604 y(The)30 b(form)g Fo(l\014eld)5 b(list1)32 -b Fp(is)d(used)h(to)h(initialize)c(lists.)167 748 y Fo(l\014eld)5 -b(list1)101 b Fk(!)f Fo(exp)33 b Fk(f)p Fp(',')h Fo(exp)6 -b Fk(g)33 b Fp([','])0 893 y(The)40 b(expressions)g(in)f(the)i(list)e -(are)i(assigned)f(to)i(consecutiv)m(e)f(n)m(umerical)f(indexes,)i -(starting)f(with)e(1.)72 b(F)-8 b(or)0 1006 y(example:)143 -1193 y Fn(a)48 b(=)f({"v1",)f("v2",)h(34})0 1381 y Fp(is)29 -b(roughly)g(equiv)-5 b(alen)m(t)30 b(to:)143 1568 y Fn(temp)47 -b(=)g({})143 1681 y(temp[1])f(=)h("v1")143 1794 y(temp[2])f(=)h("v2") -143 1907 y(temp[3])f(=)h(34)143 2020 y(a)h(=)f(temp)141 -2208 y Fp(The)30 b(next)h(form)e(initializes)f(named)i(\014elds)f(in)g -(a)i(table:)167 2326 y Fo(\016eld)5 b(list1)101 b Fk(!)f -Fo(\016eld)33 b Fk(f)p Fp(',')h Fo(\016eld)9 b Fk(g)34 -b Fp([','])337 2439 y Fo(\016eld)100 b Fk(!)g Fo(name)33 -b Fp('=')g Fo(exp)0 2576 y Fp(F)-8 b(or)31 b(example:)143 -2763 y Fn(a)48 b(=)f({x)g(=)h(1,)f(y)g(=)h(3})0 2951 -y Fp(is)29 b(roughly)g(equiv)-5 b(alen)m(t)30 b(to:)143 -3139 y Fn(temp)47 b(=)g({})143 3252 y(temp.x)f(=)i(1)190 -b(--)48 b(or)f(temp["x"])e(=)i(1)143 3365 y(temp.y)f(=)i(3)190 -b(--)48 b(or)f(temp["y"])e(=)i(3)143 3477 y(a)h(=)f(temp)0 -3718 y Fm(4.5.8)105 b(F)-9 b(unction)36 b(Calls)0 3889 -y Fp(A)30 b(function)g(call)f(has)h(the)h(follo)m(wing)e(syn)m(tax:)167 -4033 y Fo(functionc)-5 b(al)5 b(l)101 b Fk(!)e Fo(var)34 -b(r)-5 b(e)g(alPar)g(ams)0 4178 y Fp(Here,)49 b Fn(var)44 -b Fp(can)h(b)s(e)f(an)m(y)h(v)-5 b(ariable)44 b(\(global,)k(lo)s(cal,)g -(indexed,)f(etc\).)86 b(If)44 b(its)g(v)-5 b(alue)45 -b(has)f(t)m(yp)s(e)h Fo(function)52 b Fp(or)0 4291 y -Fo(CF)-7 b(unction)7 b Fp(,)29 b(then)f(this)e(function)h(is)g(called.) -39 b(Otherwise,)27 b(the)h(\\function")f(fallbac)m(k)h(is)f(called,)g -(ha)m(ving)h(as)g(\014rst)0 4403 y(parameter)j(the)f(v)-5 -b(alue)30 b(of)h Fn(var)p Fp(,)f(and)f(then)h(the)h(original)d(call)i -(parameters.)141 4516 y(The)g(form:)167 4661 y Fo(functionc)-5 -b(al)5 b(l)101 b Fk(!)e Fo(var)34 b Fp(':')42 b Fo(name)33 -b(r)-5 b(e)g(alPar)g(ams)0 4805 y Fp(can)31 b(b)s(e)e(used)h(to)h(call) -f(\\metho)s(ds".)41 b(A)30 b(call)g Fn(var:name\(...\))d -Fp(is)i(syn)m(tactic)i(sugar)g(for)95 4992 y Fn(var.name\(var,)45 -b(...\))1927 5589 y Fp(7)p eop -%%Page: 8 8 -8 7 bop 0 91 a Fp(except)31 b(that)g Fn(var)f Fp(is)f(ev)-5 -b(aluated)31 b(only)e(once.)167 228 y Fo(r)-5 b(e)g(alPar)g(ams)103 -b Fk(!)d Fp('\(')33 b([)p Fo(explist1)12 b Fp(])35 b('\)')167 -341 y Fo(r)-5 b(e)g(alPar)g(ams)103 b Fk(!)d Fo(table)-5 -b(c)g(onstructor)312 453 y(explist1)101 b Fk(!)f Fo(exp1)33 -b Fk(f)p Fp(',')h Fo(exp1)12 b Fk(g)0 590 y Fp(All)35 -b(argumen)m(t)h(expressions)f(are)i(ev)-5 b(aluated)36 -b(b)s(efore)g(the)g(call;)j(then)d(the)g(list)f(of)h(argumen)m(ts)h(is) -e(adjusted)g(to)0 703 y(the)40 b(length)g(of)h(the)f(list)f(of)h -(parameters)h(\(see)g(Section)f(4.3\);)47 b(\014nally)-8 -b(,)41 b(this)f(list)e(is)i(assigned)f(to)i(the)g(formal)0 -816 y(parameters.)i(A)32 b(call)e(of)i(the)f(form)g Fn(f{...})e -Fp(is)h(syn)m(tactic)i(sugar)f(for)g Fn(f\({...}\))p -Fp(,)f(that)i(is,)e(the)i(parameter)f(list)0 929 y(is)e(a)i(single)e -(new)h(table.)141 1042 y(Because)j(a)e(function)f(can)h(return)f(an)m -(y)i(n)m(um)m(b)s(er)d(of)j(results)d(\(see)j(Section)f(4.4.3\),)j(the) -d(n)m(um)m(b)s(er)f(of)h(results)0 1155 y(m)m(ust)c(b)s(e)g(adjusted)g -(b)s(efore)g(used.)39 b(If)27 b(the)h(function)e(is)g(called)h(as)h(a)g -(statemen)m(t)h(\(see)f(Section)g(4.4.4\),)i(its)d(return)0 -1268 y(list)37 b(is)g(adjusted)h(to)h(0.)65 b(If)38 b(the)g(function)f -(is)h(called)f(in)g(a)i(place)f(that)h(needs)f(a)h(single)e(v)-5 -b(alue)38 b(\(syn)m(tactically)0 1380 y(denoted)d(b)m(y)f(the)h -(non-terminal)e Fn(exp1)p Fp(\),)j(then)e(its)g(return)g(list)g(is)f -(adjusted)h(to)i(1.)54 b(If)35 b(the)f(function)g(is)g(called)0 -1493 y(in)k(a)h(place)h(that)f(can)h(hold)e(man)m(y)h(v)-5 -b(alues)38 b(\(syn)m(tactically)i(denoted)f(b)m(y)g(the)h(non-terminal) -d Fn(exp)p Fp(\),)k(then)e(no)0 1606 y(adjustmen)m(t)30 -b(is)g(made.)0 1850 y Ff(4.6)112 b(F)-9 b(unction)37 -b(De\014nitions)0 2021 y Fp(F)-8 b(unctions)31 b(in)g(Lua)g(can)h(b)s -(e)g(de\014ned)e(an)m(ywhere)i(in)e(the)i(global)g(lev)m(el)f(of)h(a)g -(c)m(h)m(unk.)45 b(The)31 b(syn)m(tax)i(for)e(function)0 -2134 y(de\014nition)d(is:)167 2278 y Fo(function)100 -b Fk(!)g Fm(function)33 b Fo(var)g Fp('\(')g([)p Fo(p)-5 -b(arlist1)12 b Fp(])36 b('\)')e Fo(blo)-5 b(ck)33 b Fm(end)141 -2536 y Fp(When)27 b(Lua)g(pre-compiles)f(a)i(c)m(h)m(unk,)g(all)e(its)h -(function)f(b)s(o)s(dies)f(are)j(pre-compiled,)e(to)s(o.)41 -b(Then,)27 b(when)f(Lua)0 2649 y(\\executes")33 b(the)d(function)f -(de\014nition,)f(its)i(b)s(o)s(dy)f(is)g(stored,)i(with)e(t)m(yp)s(e)i -Fo(function)p Fp(,)g(in)m(to)f(the)g(v)-5 b(ariable)30 -b Fn(var)p Fp(.)141 2761 y(P)m(arameters)i(act)f(as)g(lo)s(cal)e(v)-5 -b(ariables,)30 b(initialized)d(with)i(the)i(argumen)m(t)f(v)-5 -b(alues.)167 2906 y Fo(p)g(arlist1)102 b Fk(!)e Fo(name)33 -b Fk(f)p Fp(',')h Fo(name)7 b Fk(g)141 3163 y Fp(Results)28 -b(are)i(returned)e(using)g(the)h Fn(return)f Fp(statemen)m(t)j(\(see)f -(Section)f(4.4.3\).)43 b(If)28 b(con)m(trol)i(reac)m(hes)g(the)g(end)0 -3276 y(of)h(a)f(function)f(without)h(a)g(return)g(instruction,)e(then)i -(the)h(function)e(returns)g(with)g(no)i(results.)141 -3389 y(There)e(is)g(a)h(sp)s(ecial)e(syn)m(tax)i(for)g(de\014ning)e -(metho)s(ds,)h(that)h(is,)f(functions)f(that)j(ha)m(v)m(e)g(an)e(extra) -h(parameter)0 3502 y Fo(self)p Fp(.)167 3646 y Fo(function)100 -b Fk(!)g Fm(function)33 b Fo(var)g Fp(':')43 b Fo(name)33 -b Fp('\(')g([)p Fo(p)-5 b(arlist1)12 b Fp(])36 b('\)')d -Fo(blo)-5 b(ck)33 b Fm(end)0 3790 y Fp(Th)m(us,)d(a)g(declaration)g -(lik)m(e)0 3978 y Fn(function)46 b(v:f)g(\(...\))95 4091 -y(...)0 4203 y(end)0 4391 y Fp(is)29 b(equiv)-5 b(alen)m(t)30 -b(to)0 4579 y Fn(function)46 b(v.f)g(\(self,)h(...\))95 -4692 y(...)0 4804 y(end)0 4992 y Fp(that)33 b(is,)f(the)h(function)e -(gets)i(an)g(extra)g(formal)f(parameter)g(called)g Fn(self)p -Fp(.)46 b(Notice)33 b(that)g(the)g(v)-5 b(ariable)31 -b Fn(v)h Fp(m)m(ust)0 5105 y(ha)m(v)m(e)g(b)s(een)d(previously)f -(initialized)g(with)h(a)h(table)h(v)-5 b(alue.)1927 5589 -y(8)p eop -%%Page: 9 9 -9 8 bop 0 91 a Ff(4.7)112 b(F)-9 b(allbac)m(ks)0 263 -y Fp(Lua)33 b(pro)m(vides)g(a)h(p)s(o)m(w)m(erful)e(mec)m(hanism)h(to)i -(extend)f(its)f(seman)m(tics,)i(called)e Fo(fal)5 b(lb)-5 -b(acks)p Fp(.)51 b(A)34 b(fallbac)m(k)f(is)g(a)h(pro-)0 -376 y(grammer)c(de\014ned)f(function)h(that)h(is)e(called)g(whenev)m -(er)i(Lua)f(do)s(es)g(not)g(kno)m(w)h(ho)m(w)f(to)h(pro)s(ceed.)141 -489 y(Lua)f(supp)s(orts)f(the)h(follo)m(wing)f(fallbac)m(ks,)h(iden)m -(ti\014ed)f(b)m(y)h(the)g(giv)m(en)h(strings:)0 652 y -Fm(\\arith":)45 b Fp(called)31 b(when)g(an)i(arithmetic)e(op)s(eration) -h(is)f(applied)f(to)j(non)f(n)m(umerical)f(op)s(erands,)g(or)h(when)g -(the)227 765 y(binary)f Fn(^)h Fp(op)s(eration)g(is)g(called.)47 -b(It)32 b(receiv)m(es)i(three)e(argumen)m(ts:)46 b(the)33 -b(t)m(w)m(o)h(op)s(erands)d(\(the)i(second)g(one)227 -878 y(is)40 b(nil)f(when)h(the)h(op)s(eration)g(is)f(unary)g(min)m -(us\))f(and)h(one)i(of)f(the)g(follo)m(wing)e(strings)h(describing)f -(the)227 991 y(o\013ended)30 b(op)s(erator:)323 1186 -y Fn(add)94 b(sub)h(mul)g(div)f(pow)h(unm)227 1381 y -Fp(Its)31 b(return)f(v)-5 b(alue)30 b(is)g(the)h(\014nal)f(result)g(of) -h(the)g(arithmetic)f(op)s(eration.)42 b(The)30 b(default)g(handler)f -(issues)h(an)227 1494 y(error.)0 1672 y Fm(\\order":)45 -b Fp(called)29 b(when)e(an)i(order)g(comparison)f(is)g(applied)e(to)k -(non)e(n)m(umerical)g(or)h(non)f(string)g(op)s(erands.)39 -b(It)227 1785 y(receiv)m(es)e(three)f(argumen)m(ts:)51 -b(the)36 b(t)m(w)m(o)h(op)s(erands)e(and)g(one)h(of)g(the)g(follo)m -(wing)e(strings)g(describing)g(the)227 1898 y(o\013ended)c(op)s -(erator:)323 2093 y Fn(lt)47 b(gt)g(le)g(ge)227 2289 -y Fp(Its)28 b(return)f(v)-5 b(alue)28 b(is)f(the)i(\014nal)d(result)h -(of)i(the)f(comparison)f(op)s(eration.)40 b(The)28 b(default)f(handler) -f(issues)h(an)227 2402 y(error.)0 2580 y Fm(\\concat":)46 -b Fp(called)40 b(when)g(a)i(concatenation)g(is)e(applied)f(to)j(non)f -(string)f(op)s(erands.)71 b(It)41 b(receiv)m(es)h(the)g(t)m(w)m(o)227 -2693 y(op)s(erands)36 b(as)i(argumen)m(ts.)61 b(Its)37 -b(return)g(v)-5 b(alue)36 b(is)g(the)i(\014nal)e(result)g(of)h(the)h -(concatenation)g(op)s(eration.)227 2805 y(The)30 b(default)g(handler)e -(issues)h(an)i(error.)0 2983 y Fm(\\index":)45 b Fp(called)27 -b(when)g(Lua)g(tries)g(to)i(retriev)m(e)f(the)g(v)-5 -b(alue)27 b(of)h(an)f(index)g(not)h(presen)m(t)f(in)g(a)h(table.)39 -b(It)28 b(receiv)m(es)227 3096 y(as)41 b(argumen)m(ts)f(the)g(table)g -(and)g(the)g(index.)68 b(Its)40 b(return)f(v)-5 b(alue)40 -b(is)f(the)h(\014nal)f(result)g(of)h(the)g(indexing)227 -3209 y(op)s(eration.)g(The)30 b(default)g(handler)e(returns)i(nil.)0 -3387 y Fm(\\getglobal":)45 b Fp(called)28 b(when)g(Lua)g(tries)g(to)h -(retriev)m(e)g(the)f(v)-5 b(alue)28 b(of)h(a)g(global)f(v)-5 -b(ariable)27 b(whic)m(h)g(has)h(a)h(nil)d(v)-5 b(alue)227 -3500 y(\(or)39 b(whic)m(h)e(has)g(not)i(b)s(een)e(initialized\).)61 -b(It)38 b(receiv)m(es)h(as)g(argumen)m(t)f(the)h(name)f(of)g(the)g(v)-5 -b(ariable.)63 b(Its)227 3613 y(return)30 b(v)-5 b(alue)29 -b(is)h(the)g(\014nal)f(result)h(of)g(the)h(expression.)39 -b(The)30 b(default)g(handler)e(returns)h(nil.)0 3790 -y Fm(\\gettable":)44 b Fp(called)34 b(when)g(Lua)g(tries)g(to)h(index)f -(a)h(non)f(table)g(v)-5 b(alue.)53 b(It)35 b(receiv)m(es)g(as)g -(argumen)m(ts)g(the)g(non)227 3903 y(table)d(v)-5 b(alue)31 -b(and)f(the)i(index.)42 b(Its)32 b(return)e(v)-5 b(alue)31 -b(is)g(the)g(\014nal)f(result)h(of)g(the)h(indexing)d(op)s(eration.)43 -b(The)227 4016 y(default)30 b(handler)e(issues)h(an)i(error.)0 -4194 y Fm(\\settable":)44 b Fp(called)34 b(when)e(Lua)i(tries)f(to)i -(assign)e(indexed)g(a)h(non)f(table)h(v)-5 b(alue.)51 -b(It)34 b(receiv)m(es)g(as)h(argumen)m(ts)227 4307 y(the)c(non)f(table) -g(v)-5 b(alue,)30 b(the)h(index,)e(and)h(the)g(assigned)g(v)-5 -b(alue.)40 b(The)30 b(default)f(handler)g(issues)g(an)h(error.)0 -4485 y Fm(\\function":)46 b Fp(called)30 b(when)g(Lua)h(tries)g(to)h -(call)e(a)i(non)e(function)g(v)-5 b(alue.)43 b(It)31 -b(receiv)m(es)h(as)g(argumen)m(ts)f(the)h(non)227 4598 -y(function)k(v)-5 b(alue)36 b(and)h(the)g(argumen)m(ts)g(giv)m(en)g(in) -f(the)h(original)e(call.)60 b(Its)37 b(return)f(v)-5 -b(alues)36 b(are)h(the)g(\014nal)227 4711 y(results)29 -b(of)i(the)g(call)e(op)s(eration.)40 b(The)30 b(default)g(handler)e -(issues)h(an)i(error.)0 4888 y Fm(\\gc":)46 b Fp(called)35 -b(during)g(garbage)i(collection.)59 b(It)37 b(receiv)m(es)g(as)f -(argumen)m(t)h(the)g(table)f(b)s(eing)f(collected.)60 -b(After)227 5001 y(eac)m(h)42 b(run)d(of)i(the)g(collector)g(this)e -(function)h(is)f(called)h(with)f(argumen)m(t)i(nil.)70 -b(Because)42 b(this)d(function)227 5114 y(op)s(erates)28 -b(during)e(garbage)i(collection,)g(it)f(m)m(ust)h(b)s(e)e(used)h(with)f -(great)j(care,)g(and)e(programmers)g(should)227 5227 -y(a)m(v)m(oid)39 b(the)f(creation)g(of)g(new)g(ob)5 b(jects)38 -b(\(tables)h(or)e(strings\))h(in)e(this)h(function.)62 -b(The)38 b(default)f(handler)227 5340 y(do)s(es)30 b(nothing.)1927 -5589 y(9)p eop -%%Page: 10 10 -10 9 bop 0 91 a Fm(\\error":)45 b Fp(called)32 b(when)g(an)g(error)g(o) -s(ccurs.)47 b(It)33 b(receiv)m(es)g(as)g(argumen)m(t)g(a)g(string)f -(describing)e(the)j(error.)46 b(The)227 204 y(default)30 -b(handler)e(prin)m(ts)h(the)i(message)g(on)g(the)f(standard)g(error)g -(output.)141 392 y(The)f(function)f Fn(setfallback)e -Fp(is)j(used)f(to)i(c)m(hange)h(a)f(fallbac)m(k)f(handler.)38 -b(Its)29 b(\014rst)g(argumen)m(t)h(is)e(the)i(name)0 -505 y(of)k(a)h(fallbac)m(k)e(condition,)h(and)f(the)h(second)g(argumen) -m(t)h(is)e(the)h(new)f(function)g(to)i(b)s(e)e(called.)51 -b(It)34 b(returns)f(the)0 618 y(old)d(handler)e(function)h(for)h(the)h -(giv)m(en)f(fallbac)m(k.)141 731 y(Section)g(8.6)i(sho)m(ws)e(an)g -(example)g(of)h(the)f(use)g(of)h(fallbac)m(ks.)0 974 -y Ff(4.8)112 b(Error)37 b(Handling)0 1146 y Fp(Because)g(Lua)e(is)g(an) -g(extension)h(language,)h(all)e(Lua)g(actions)h(start)g(from)f(C)g(co)s -(de)h(calling)e(a)i(function)e(from)0 1259 y(the)48 b(Lua)f(library)-8 -b(.)90 b(Whenev)m(er)48 b(an)f(error)g(o)s(ccurs)g(during)e(Lua)j -(compilation)e(or)h(execution,)52 b(an)47 b(\\error")0 -1371 y(fallbac)m(k)42 b(function)f(is)h(called,)i(and)e(then)g(the)h -(corresp)s(onding)d(function)i(from)f(the)i(library)d(\()p -Fn(lua_dofile)p Fp(,)0 1484 y Fn(lua_dostring)p Fp(,)27 -b Fn(lua_call)p Fp(,)i(or)h Fn(lua_callfunction)p Fp(\))c(is)k -(terminated)g(returning)e(an)i(error)g(condition.)141 -1597 y(The)22 b(only)g(argumen)m(t)g(to)i(the)e(\\error")h(fallbac)m(k) -f(function)f(is)g(a)i(string)f(describing)e(the)i(error.)38 -b(The)22 b(standard)0 1710 y(I/O)29 b(library)e(rede\014nes)h(this)g -(fallbac)m(k,)h(using)e(the)i(debug)g(facilities)e(\(see)j(Section)f -(7\),)h(in)e(order)g(to)i(prin)m(t)e(some)0 1823 y(extra)33 -b(information,)e(lik)m(e)g(the)i(call)e(stac)m(k.)48 -b(F)-8 b(or)33 b(more)f(information)e(ab)s(out)i(an)g(error,)h(the)f -(Lua)g(program)g(can)0 1936 y(include)e(the)i(compilation)f(pragma)i -Fn($debug)p Fp(.)90 b(This)31 b(pragma)h(m)m(ust)g(b)s(e)g(written)f -(in)g(a)h(line)f(b)m(y)h(itself.)45 b(When)0 2049 y(an)32 -b(error)f(o)s(ccurs)h(in)e(a)i(program)g(compiled)e(with)h(this)g -(option,)g(the)h(error)g(routine)f(is)g(able)g(to)i(prin)m(t)d(also)i -(the)0 2162 y(lines)37 b(where)h(the)h(calls)f(\(and)g(the)h(error\))g -(w)m(ere)g(made.)66 b(If)38 b(needed,)j(it)d(is)g(p)s(ossible)e(to)k(c) -m(hange)g(the)e(\\error")0 2275 y(fallbac)m(k)30 b(handler)e(\(see)k -(Section)e(4.7\).)141 2388 y(Lua)23 b(co)s(de)h(can)g(explicitly)d -(generate)k(an)e(error)g(b)m(y)g(calling)f(the)i(built-in)c(function)j -Fn(error)f Fp(\(see)i(Section)f(6.1\).)0 2674 y Fq(5)135 -b(The)44 b(Application)i(Program)f(In)l(terface)0 2877 -y Fp(This)24 b(section)j(describ)s(es)d(the)j(API)f(for)g(Lua,)h(that)g -(is,)f(the)h(set)g(of)f(C)g(functions)f(a)m(v)-5 b(ailable)25 -b(to)i(the)g(host)f(program)0 2990 y(to)31 b(comm)m(unicate)g(with)e -(the)i(library)-8 b(.)39 b(The)29 b(API)i(functions)d(can)j(b)s(e)f -(classi\014ed)f(in)g(the)h(follo)m(wing)f(categories:)111 -3178 y(1.)46 b(executing)31 b(Lua)f(co)s(de;)111 3365 -y(2.)46 b(con)m(v)m(erting)31 b(v)-5 b(alues)30 b(b)s(et)m(w)m(een)h(C) -f(and)g(Lua;)111 3553 y(3.)46 b(manipulating)28 b(\(reading)i(and)f -(writing\))g(Lua)h(ob)5 b(jects;)111 3740 y(4.)46 b(calling)29 -b(Lua)h(functions;)111 3928 y(5.)46 b(C)30 b(functions)f(to)i(b)s(e)f -(called)g(b)m(y)g(Lua;)111 4116 y(6.)46 b(references)31 -b(to)g(Lua)f(Ob)5 b(jects.)0 4303 y(All)29 b(API)h(functions)f(are)i -(declared)f(in)f(the)h(header)h(\014le)e Fn(lua.h)p Fp(.)0 -4547 y Ff(5.1)112 b(Executing)37 b(Lua)h(Co)s(de)0 4718 -y Fp(A)23 b(host)h(program)f(can)h(execute)g(Lua)f(c)m(h)m(unks)g -(written)g(in)f(a)h(\014le)g(or)g(in)f(a)i(string,)g(using)e(the)h -(follo)m(wing)f(functions:)0 5019 y Fn(int)47 b(lua_dofile)140 -b(\(char)47 b(*filename\);)0 5132 y(int)g(lua_dostring)d(\(char)j -(*string\);)1905 5589 y Fp(10)p eop -%%Page: 11 11 -11 10 bop 0 91 a Fp(Both)29 b(functions)e(return)h(an)g(error)g(co)s -(de:)40 b(0,)30 b(in)d(case)j(of)e(success;)i(non)e(zero,)i(in)d(case)j -(of)e(errors.)40 b(More)29 b(sp)s(eci\014-)0 204 y(cally)-8 -b(,)30 b Fn(lua_dofile)d Fp(returns)i(2)h(if)f(for)h(an)m(y)g(reason)g -(it)g(could)f(not)h(op)s(en)f(the)i(\014le.)39 b(The)30 -b(function)e Fn(lua_dofile)p Fp(,)0 317 y(if)h(called)g(with)g(argumen) -m(t)i Fn(NULL)e Fp(\(0\),)i(executes)h(the)e Fn(stdin)f -Fp(stream.)41 b(F)-8 b(unction)30 b Fn(lua_dofile)d Fp(is)i(also)h -(able)g(to)0 430 y(execute)h(pre-compiled)d(c)m(h)m(unks.)40 -b(It)30 b(automatically)f(detects)i(whether)e(the)h(\014le)f(is)f(text) -j(or)f(binary)-8 b(,)28 b(and)h(loads)0 543 y(it)h(accordingly)f(\(see) -j(program)e Fn(luac)p Fp(\).)0 786 y Ff(5.2)112 b(Con)m(v)m(erting)37 -b(V)-9 b(alues)37 b(b)s(et)m(w)m(een)g(C)h(and)g(Lua)0 -958 y Fp(Because)25 b(Lua)e(has)g(no)h(static)g(t)m(yp)s(e)g(system,)h -(all)e(v)-5 b(alues)22 b(passed)h(b)s(et)m(w)m(een)i(Lua)e(and)g(C)g -(ha)m(v)m(e)i(t)m(yp)s(e)e Fn(lua_Object)p Fp(,)0 1071 -y(whic)m(h)e(w)m(orks)h(lik)m(e)f(an)h(abstract)g(t)m(yp)s(e)h(in)d(C)i -(that)g(can)h(hold)d(an)m(y)i(Lua)g(v)-5 b(alue.)37 b(V)-8 -b(alues)22 b(of)g(t)m(yp)s(e)h Fn(lua_Object)c Fp(ha)m(v)m(e)0 -1184 y(no)30 b(meaning)g(outside)g(Lua;)g(for)g(instance,)g(the)h -(comparisson)e(of)i(t)m(w)m(o)h Fn(lua_Object's)27 b -Fp(is)i(of)i(no)f(signi\014cance.)141 1297 y(Because)j(Lua)f(has)f -(automatic)i(memory)f(managemen)m(t)h(and)e(garbage)i(collection,)f(a)g -Fn(lua_Object)d Fp(has)j(a)0 1410 y(limited)i(scop)s(e,)k(and)e(is)f -(only)g(v)-5 b(alid)35 b(inside)f(the)i Fo(blo)-5 b(ck)47 -b Fp(where)36 b(it)g(w)m(as)g(created.)60 b(A)36 b(C)g(function)f -(called)g(from)0 1523 y(Lua)30 b(is)f(a)h(blo)s(c)m(k,)g(and)f(its)h -(parameters)g(are)g(v)-5 b(alid)29 b(only)g(un)m(til)f(its)h(end.)40 -b(A)30 b(go)s(o)s(d)g(programming)f(practice)h(is)f(to)0 -1635 y(con)m(v)m(ert)35 b(Lua)d(ob)5 b(jects)34 b(to)g(C)e(v)-5 -b(alues)33 b(as)g(so)s(on)g(as)g(they)g(are)h(a)m(v)-5 -b(ailable,)33 b(and)f(nev)m(er)i(to)g(store)f Fn(lua_Object)p -Fp(s)d(in)0 1748 y(C)g(global)g(v)-5 b(ariables.)141 -1861 y(When)26 b(C)f(co)s(de)h(calls)f(Lua)h(rep)s(eatedly)-8 -b(,)27 b(as)f(in)f(a)h(lo)s(op,)g(ob)5 b(jects)27 b(returned)d(b)m(y)i -(these)h(calls)e(accum)m(ulate,)j(and)0 1974 y(ma)m(y)j(create)h(a)f -(memory)f(problem.)39 b(T)-8 b(o)31 b(a)m(v)m(oid)g(this,)e(nested)i -(blo)s(c)m(ks)e(can)i(b)s(e)f(de\014ned)f(with)g(the)i(functions:)0 -2162 y Fn(void)524 b(lua_beginblock)d(\(void\);)0 2275 -y(void)j(lua_endblock)617 b(\(void\);)0 2462 y Fp(After)31 -b(the)f(end)g(of)g(the)h(blo)s(c)m(k,)f(all)f Fn(lua_Object)p -Fp('s)f(created)k(inside)c(it)i(are)g(released.)141 2575 -y(T)-8 b(o)31 b(c)m(hec)m(k)h(the)e(t)m(yp)s(e)h(of)g(a)f -Fn(lua_Object)p Fp(,)e(the)j(follo)m(wing)e(function)g(is)g(a)m(v)-5 -b(ailable:)0 2763 y Fn(int)572 b(lua_type)809 b(\(lua_Object)45 -b(object\);)0 2951 y Fp(plus)28 b(the)j(follo)m(wing)e(macros)i(and)e -(functions:)0 3138 y Fn(int)572 b(lua_isnil)761 b(\(lua_Object)45 -b(object\);)0 3251 y(int)572 b(lua_isnumber)617 b(\(lua_Object)45 -b(object\);)0 3364 y(int)572 b(lua_isstring)617 b(\(lua_Object)45 -b(object\);)0 3477 y(int)572 b(lua_istable)665 b(\(lua_Object)45 -b(object\);)0 3590 y(int)572 b(lua_isfunction)521 b(\(lua_Object)45 -b(object\);)0 3703 y(int)572 b(lua_iscfunction)473 b(\(lua_Object)45 -b(object\);)0 3816 y(int)572 b(lua_isuserdata)521 b(\(lua_Object)45 -b(object\);)0 4003 y Fp(All)28 b(macros)h(return)g(1)g(if)f(the)i(ob)5 -b(ject)30 b(is)e(compatible)g(with)g(the)i(giv)m(en)f(t)m(yp)s(e,)h -(and)e(0)i(otherwise.)40 b(The)28 b(function)0 4116 y -Fn(lua_isnumber)c Fp(accepts)k(n)m(um)m(b)s(ers)e(and)h(n)m(umerical)e -(strings,)i Fn(lua_isstring)d Fp(accepts)29 b(strings)d(and)g(n)m(um)m -(b)s(ers)0 4229 y(\(see)33 b(Section)f(4.2\),)i(and)d -Fn(lua_isfunction)d Fp(accepts)33 b(Lua)f(and)f(C)h(functions.)44 -b(The)31 b(function)g Fn(lua_type)f Fp(can)0 4342 y(b)s(e)g(used)f(to)i -(distinguish)c(b)s(et)m(w)m(een)k(di\013eren)m(t)f(kinds)e(of)j(user)e -(data.)141 4455 y(T)-8 b(o)31 b(translate)g(a)f(v)-5 -b(alue)30 b(from)g(t)m(yp)s(e)h Fn(lua_Object)c Fp(to)k(a)g(sp)s -(eci\014c)e(C)h(t)m(yp)s(e,)h(the)f(programmer)g(can)h(use:)0 -4643 y Fn(double)428 b(lua_getnumber)569 b(\(lua_Object)45 -b(object\);)0 4755 y(char)476 b(*lua_getstring)569 b(\(lua_Object)45 -b(object\);)0 4868 y(lua_CFunction)92 b(lua_getcfunction)425 -b(\(lua_Object)45 b(object\);)0 4981 y(void)476 b(*lua_getuserdata)d -(\(lua_Object)45 b(object\);)0 5169 y(lua_getnumber)26 -b Fp(con)m(v)m(erts)32 b(a)e Fn(lua_Object)d Fp(to)k(a)f(\015oat.)41 -b(This)29 b Fn(lua_Object)e Fp(m)m(ust)i(b)s(e)h(a)g(n)m(um)m(b)s(er)f -(or)h(a)g(string)0 5282 y(con)m(v)m(ertible)g(to)h(n)m(um)m(b)s(er)f -(\(see)h(Section)f(4.2\);)i(otherwise,)e(the)h(function)e(returns)g(0.) -1905 5589 y(11)p eop -%%Page: 12 12 -12 11 bop 141 91 a Fn(lua_getstring)21 b Fp(con)m(v)m(erts)27 -b(a)e Fn(lua_Object)d Fp(to)k(a)f(string)f(\()p Fn(char)47 -b(*)p Fp(\).)39 b(This)23 b Fn(lua_Object)f Fp(m)m(ust)i(b)s(e)h(a)g -(string)0 204 y(or)32 b(a)g(n)m(um)m(b)s(er;)f(otherwise,)h(the)g -(function)e(returns)h(0)h(\(the)g(n)m(ull)e(p)s(oin)m(ter\).)44 -b(This)30 b(function)g(do)s(es)h(not)h(create)i(a)0 317 -y(new)27 b(string,)g(but)g(returns)f(a)i(p)s(oin)m(ter)f(to)h(a)g -(string)f(inside)e(the)j(Lua)f(en)m(vironmen)m(t.)39 -b(Because)29 b(Lua)e(has)h(garbage)0 430 y(collection,)i(there)h(is)e -(no)i(guaran)m(tee)g(that)g(suc)m(h)f(p)s(oin)m(ter)g(will)e(b)s(e)h(v) --5 b(alid)29 b(after)i(the)f(blo)s(c)m(k)g(ends.)141 -543 y Fn(lua_getcfunction)e Fp(con)m(v)m(erts)34 b(a)e -Fn(lua_Object)e Fp(to)j(a)f(C)g(function.)45 b(This)31 -b Fn(lua_Object)e Fp(m)m(ust)j(ha)m(v)m(e)i(t)m(yp)s(e)0 -656 y Fo(CF)-7 b(unction)7 b Fp(;)39 b(otherwise,)e(the)f(function)e -(returns)g(0)i(\(the)g(n)m(ull)e(p)s(oin)m(ter\).)56 -b(The)35 b(t)m(yp)s(e)h Fn(lua_CFunction)c Fp(is)i(ex-)0 -769 y(plained)28 b(in)h(Section)h(5.5.)141 882 y Fn(lua_getuserdata)20 -b Fp(con)m(v)m(erts)26 b(a)f Fn(lua_Object)d Fp(to)j -Fn(void*)p Fp(.)38 b(This)22 b Fn(lua_Object)g Fp(m)m(ust)i(ha)m(v)m(e) -i(t)m(yp)s(e)f Fo(user)-5 b(data)7 b Fp(;)0 995 y(otherwise,)30 -b(the)h(function)e(returns)g(0)i(\(the)f(n)m(ull)f(p)s(oin)m(ter\).)141 -1108 y(The)34 b(rev)m(erse)h(pro)s(cess,)g(that)f(is,)h(passing)e(a)i -(sp)s(eci\014c)e(C)g(v)-5 b(alue)34 b(to)h(Lua,)g(is)e(done)h(b)m(y)g -(using)f(the)h(follo)m(wing)0 1220 y(functions:)0 1403 -y Fn(void)524 b(lua_pushnumber)d(\(double)46 b(n\);)0 -1516 y(void)524 b(lua_pushstring)d(\(char)46 b(*s\);)0 -1629 y(void)524 b(lua_pushcfunction)377 b(\(lua_CFunction)44 -b(f\);)0 1742 y(void)524 b(lua_pushusertag)473 b(\(void)46 -b(*u,)h(int)g(tag\);)0 1925 y Fp(plus)28 b(the)j(macro:)0 -2108 y Fn(void)524 b(lua_pushuserdata)425 b(\(void)46 -b(*u\);)0 2291 y Fp(All)33 b(of)h(them)f(receiv)m(e)i(a)g(C)e(v)-5 -b(alue,)35 b(con)m(v)m(ert)g(it)e(to)i(a)f(corresp)s(onding)e -Fn(lua_Object)p Fp(,)h(and)g(lea)m(v)m(e)i(the)f(result)f(on)0 -2404 y(the)c(top)g(of)f(the)h(Lua)g(stac)m(k,)h(where)e(it)g(can)h(b)s -(e)f(assigned)g(to)i(a)f(Lua)f(v)-5 b(ariable,)28 b(passed)g(as)h -(parameter)g(to)g(a)g(Lua)0 2517 y(function,)g(etc.)141 -2629 y(User)43 b(data)g(can)g(ha)m(v)m(e)h(di\013eren)m(t)e(tags,)47 -b(whose)42 b(seman)m(tics)h(are)g(de\014ned)f(b)m(y)g(the)h(host)g -(program.)77 b(An)m(y)0 2742 y(p)s(ositiv)m(e)35 b(in)m(teger)h(can)g -(b)s(e)g(used)f(to)h(tag)h(a)g(user)e(datum.)56 b(When)36 -b(a)g(user)f(datum)h(is)f(retriev)m(ed,)i(the)f(function)0 -2855 y Fn(lua_type)28 b Fp(can)j(b)s(e)f(used)f(to)i(get)h(its)d(tag.) -141 2968 y(T)-8 b(o)31 b(complete)g(the)f(set,)i(the)e(v)-5 -b(alue)30 b Fm(nil)g Fp(or)h(a)g Fn(lua_Object)c Fp(can)k(also)f(b)s(e) -g(pushed)e(on)m(to)k(the)f(stac)m(k,)h(with:)0 3151 y -Fn(void)524 b(lua_pushnil)665 b(\(void\);)0 3264 y(void)524 -b(lua_pushobject)d(\(lua_Object)45 b(object\);)0 3507 -y Ff(5.3)112 b(Manipulating)37 b(Lua)h(Ob)6 b(jects)0 -3678 y Fp(T)-8 b(o)31 b(read)f(the)h(v)-5 b(alue)30 b(of)g(an)m(y)h -(global)e(Lua)i(v)-5 b(ariable,)29 b(one)i(uses)f(the)g(function:)0 -3861 y Fn(lua_Object)236 b(lua_getglobal)569 b(\(char)46 -b(*varname\);)0 4044 y Fp(As)30 b(in)f(Lua,)i(if)e(the)i(v)-5 -b(alue)29 b(of)i(the)g(global)e(is)h Fm(nil)p Fp(,)g(then)g(the)h -(\\getglobal")h(fallbac)m(k)e(is)f(called.)141 4157 y(T)-8 -b(o)31 b(store)g(a)g(v)-5 b(alue)30 b(previously)e(pushed)g(on)m(to)k -(the)e(stac)m(k)i(in)d(a)i(global)f(v)-5 b(ariable,)29 -b(there)i(is)e(the)i(function:)0 4340 y Fn(void)524 b(lua_storeglobal) -473 b(\(char)46 b(*varname\);)141 4523 y Fp(T)-8 b(ables)30 -b(can)h(also)f(b)s(e)g(manipulated)e(via)i(the)h(API.)f(The)g(function) -0 4705 y Fn(lua_Object)236 b(lua_getsubscript)425 b(\(void\);)0 -4888 y Fp(exp)s(ects)31 b(on)f(the)g(stac)m(k)i(a)f(table)f(and)f(an)i -(index,)e(and)g(returns)g(the)i(con)m(ten)m(ts)h(of)e(the)h(table)f(at) -h(that)g(index.)39 b(As)0 5001 y(in)29 b(Lua,)h(if)f(the)h(\014rst)f -(ob)5 b(ject)31 b(is)e(not)i(a)f(table,)g(or)g(the)g(index)f(is)g(not)h -(presen)m(t)h(in)d(the)i(table,)h(the)f(corresp)s(onding)0 -5114 y(fallbac)m(k)g(is)f(called.)141 5227 y(T)-8 b(o)34 -b(store)f(a)h(v)-5 b(alue)32 b(in)g(an)h(index,)f(the)h(program)g(m)m -(ust)g(push)e(on)m(to)j(the)f(stac)m(k)i(the)e(table,)h(the)f(index,)g -(and)0 5340 y(the)e(v)-5 b(alue,)30 b(and)f(then)i(call)e(the)i -(function:)1905 5589 y(12)p eop -%%Page: 13 13 -13 12 bop 0 91 a Fn(void)47 b(lua_storesubscript)42 b(\(void\);)0 -264 y Fp(Again,)30 b(the)h(corresp)s(onding)d(fallbac)m(k)i(is)g -(called)f(if)g(needed.)141 377 y(Finally)-8 b(,)29 b(the)i(function)0 -549 y Fn(lua_Object)236 b(lua_createtable)473 b(\(void\);)0 -721 y Fp(creates)32 b(and)e(returns)f(a)h(new)g(table.)141 -834 y Fo(Ple)-5 b(ase)40 b(Notic)-5 b(e:)61 b Fp(Most)39 -b(functions)d(from)h(the)h(Lua)g(library)d(receiv)m(e)k(parameters)f -(through)g(Lua's)f(stac)m(k.)0 947 y(Because)e(other)f(functions)f -(also)h(use)f(this)g(stac)m(k,)k(it)c(is)g(imp)s(ortan)m(t)g(that)i -(these)f(parameters)g(b)s(e)f(pushed)g(just)0 1060 y(b)s(efore)d(the)g -(corresp)s(onding)e(call,)i(without)f(in)m(termediate)h(calls)f(to)i -(the)f(Lua)g(library)-8 b(.)38 b(F)-8 b(or)31 b(instance,)f(supp)s(ose) -0 1173 y(the)h(user)e(w)m(an)m(ts)i(the)g(v)-5 b(alue)30 -b(of)g Fn(a[i])p Fp(.)40 b(A)30 b(simplistic)d(solution)i(w)m(ould)g(b) -s(e:)95 1345 y Fn(/*)48 b(Warning:)d(WRONG)i(CODE)f(*/)95 -1458 y(lua_Object)f(result;)95 1571 y(lua_pushobject\(lua_getglob)o -(al\(")o(a"\))o(\);)89 b(/*)48 b(push)e(table)h(*/)95 -1684 y(lua_pushobject\(lua_getglob)o(al\(")o(i"\))o(\);)89 -b(/*)48 b(push)e(index)h(*/)95 1797 y(result)g(=)g -(lua_getsubscript\(\);)0 1969 y Fp(Ho)m(w)m(ev)m(er,)d(the)39 -b(call)f Fn(lua_getglobal\("i"\))d Fp(mo)s(di\014es)i(the)i(stac)m(k,)k -(and)c(in)m(v)-5 b(alidates)38 b(the)h(previous)f(pushed)0 -2082 y(v)-5 b(alue.)40 b(A)31 b(correct)g(solution)e(could)h(b)s(e:)95 -2254 y Fn(lua_Object)45 b(result;)95 2367 y(lua_Object)g(index)i(=)g -(lua_getglobal\("i"\);)95 2480 y(lua_pushobject\(lua_getglob)o(al\(")o -(a"\))o(\);)89 b(/*)48 b(push)e(table)h(*/)95 2593 y -(lua_pushobject\(index\);)710 b(/*)48 b(push)e(index)h(*/)95 -2706 y(result)g(=)g(lua_getsubscript\(\);)0 2878 y Fp(The)35 -b(functions)f Fn(lua_getnumber)p Fp(,)f Fn(lua_getstring)p -Fp(,)g Fn(lua_getuserdata)p Fp(,)g(and)h Fn(lua_getcfunction)p -Fp(,)f(plus)0 2991 y(the)e(family)d Fn(lua_is*)p Fp(,)h(are)i(safe)g -(to)g(b)s(e)e(called)h(without)f(mo)s(difying)f(the)j(stac)m(k.)0 -3231 y Ff(5.4)112 b(Calling)36 b(Lua)i(F)-9 b(unctions)0 -3403 y Fp(F)h(unctions)36 b(de\014ned)g(in)f(Lua)i(b)m(y)f(a)h(c)m(h)m -(unk)g(executed)h(with)d Fn(dofile)g Fp(or)i Fn(dostring)d -Fp(can)j(b)s(e)g(called)e(from)i(the)0 3516 y(host)d(program.)50 -b(This)32 b(is)h(done)g(using)f(the)i(follo)m(wing)e(proto)s(col:)47 -b(\014rst,)34 b(the)g(argumen)m(ts)g(to)g(the)g(function)f(are)0 -3629 y(pushed)27 b(on)m(to)j(the)f(Lua)g(stac)m(k)h(\(see)g(Section)e -(5.2\),)j(in)d(direct)g(order,)h(i.e.,)g(the)g(\014rst)f(argumen)m(t)i -(is)d(pushed)g(\014rst.)0 3742 y(Again,)j(it)g(is)g(imp)s(ortan)m(t)f -(to)i(emphasize)f(that,)h(during)e(this)g(phase,)h(no)g(other)h(Lua)f -(function)f(can)i(b)s(e)f(called.)141 3855 y(Then,)g(the)g(function)f -(is)h(called)f(using)0 4027 y Fn(int)572 b(lua_call)809 -b(\(char)46 b(*functionname\);)0 4199 y Fp(or)0 4372 -y Fn(int)572 b(lua_callfunction)425 b(\(lua_Object)45 -b(function\);)0 4544 y Fp(Both)32 b(functions)e(return)h(an)h(error)f -(co)s(de:)43 b(0,)33 b(in)d(case)j(of)f(success;)g(non)f(zero,)i(in)e -(case)h(of)g(errors.)44 b(Finally)-8 b(,)31 b(the)0 4657 -y(returned)e(v)-5 b(alues)30 b(\(a)h(Lua)f(function)f(ma)m(y)i(return)e -(man)m(y)i(v)-5 b(alues\))30 b(can)h(b)s(e)e(retriev)m(ed)i(with)e(the) -h(macro)0 4829 y Fn(lua_Object)236 b(lua_getresult)617 -b(\(int)46 b(number\);)0 5001 y Fp(where)33 b Fn(number)f -Fp(is)h(the)g(order)h(of)f(the)h(result,)g(starting)f(with)f(1.)51 -b(When)33 b(called)g(with)g(a)h(n)m(um)m(b)s(er)e(larger)h(than)0 -5114 y(the)e(actual)f(n)m(um)m(b)s(er)f(of)i(results,)e(this)h -(function)f(returns)g Fn(LUA_NOOBJECT)p Fp(.)141 5227 -y(Tw)m(o)37 b(sp)s(ecial)e(Lua)i(functions)e(ha)m(v)m(e)j(exclusiv)m(e) -e(in)m(terfaces:)54 b Fn(error)35 b Fp(and)h Fn(setfallback)p -Fp(.)57 b(A)37 b(C)f(function)0 5340 y(can)31 b(generate)h(a)e(Lua)g -(error)g(calling)f(the)i(function)1905 5589 y(13)p eop -%%Page: 14 14 -14 13 bop 0 91 a Fn(void)47 b(lua_error)e(\(char)h(*message\);)0 -279 y Fp(This)34 b(function)g(nev)m(er)j(returns.)55 -b(If)36 b(the)g(C)f(function)f(has)i(b)s(een)f(called)g(from)g(Lua,)i -(the)f(corresp)s(onding)e(Lua)0 392 y(execution)f(terminates,)g(as)g -(if)e(an)i(error)f(had)g(o)s(ccurred)g(inside)e(Lua)i(co)s(de.)48 -b(Otherwise,)32 b(the)g(whole)g(program)0 505 y(terminates.)141 -618 y(F)-8 b(allbac)m(ks)31 b(can)g(b)s(e)e(c)m(hanged)i(with:)0 -805 y Fn(lua_Object)45 b(lua_setfallback)f(\(char)i(*name,)g -(lua_CFunction)e(fallback\);)0 993 y Fp(The)22 b(\014rst)g(parameter)h -(is)f(the)h(fallbac)m(k)f(name,)i(and)e(the)h(second)g(a)g(CF)-8 -b(unction)22 b(to)h(b)s(e)f(used)g(as)h(the)g(new)f(fallbac)m(k.)0 -1106 y(This)28 b(function)g(returns)g(a)i Fn(lua_Object)p -Fp(,)d(whic)m(h)h(is)h(the)g(old)g(fallbac)m(k)g(v)-5 -b(alue,)29 b(or)h Fm(nil)g Fp(on)f(fail)f(\(in)m(v)-5 -b(alid)27 b(fallbac)m(k)0 1219 y(name\).)41 b(This)29 -b(old)g(v)-5 b(alue)30 b(can)h(b)s(e)e(used)h(for)g(c)m(haining)f -(fallbac)m(ks.)141 1332 y(An)h(example)g(of)h(C)f(co)s(de)g(calling)f -(a)i(Lua)f(function)f(is)g(sho)m(wn)h(in)f(Section)h(8.10.)0 -1575 y Ff(5.5)112 b(C)38 b(F)-9 b(unctions)0 1747 y Fp(T)h(o)31 -b(register)f(a)h(C)f(function)f(to)i(Lua,)f(there)h(is)e(the)i(follo)m -(wing)e(macro:)0 1934 y Fn(#define)46 b(lua_register\(n,f\))329 -b(\(lua_pushcfunction\(f\),)42 b(lua_storeglobal\(n\)\))0 -2047 y(/*)47 b(char)g(*n;)429 b(*/)0 2160 y(/*)47 b(lua_CFunction)d(f;) -k(*/)0 2348 y Fp(whic)m(h)28 b(receiv)m(es)i(the)g(name)f(the)g -(function)f(will)f(ha)m(v)m(e)k(in)d(Lua,)h(and)g(a)g(p)s(oin)m(ter)g -(to)h(the)f(function.)39 b(This)28 b(p)s(oin)m(ter)0 -2461 y(m)m(ust)i(ha)m(v)m(e)i(t)m(yp)s(e)e Fn(lua_CFunction)p -Fp(,)d(whic)m(h)i(is)h(de\014ned)f(as)0 2648 y Fn(typedef)46 -b(void)g(\(*lua_CFunction\))e(\(void\);)0 2836 y Fp(that)31 -b(is,)f(a)g(p)s(oin)m(ter)g(to)h(a)g(function)e(with)g(no)h(parameters) -h(and)f(no)g(results.)141 2949 y(In)d(order)h(to)g(comm)m(unicate)g -(prop)s(erly)e(with)h(Lua,)h(a)g(C)f(function)g(m)m(ust)h(follo)m(w)f -(a)h(proto)s(col,)g(whic)m(h)f(de\014nes)0 3062 y(the)k(w)m(a)m(y)g -(parameters)g(and)e(results)h(are)g(passed.)141 3175 -y(T)-8 b(o)31 b(access)h(its)d(argumen)m(ts,)i(a)g(C)f(function)f -(calls:)0 3362 y Fn(lua_Object)236 b(lua_getparam)617 -b(\(int)47 b(number\);)0 3550 y Fp(where)30 b Fn(number)f -Fp(starts)i(with)e(1)i(to)g(get)g(the)g(\014rst)f(argumen)m(t.)41 -b(When)31 b(called)e(with)g(a)i(n)m(um)m(b)s(er)e(larger)i(than)f(the)0 -3663 y(actual)25 b(n)m(um)m(b)s(er)f(of)h(argumen)m(ts,)h(this)e -(function)f(returns)h Fn(LUA_NOOBJECT)p Fp(.)d(In)j(this)g(w)m(a)m(y)-8 -b(,)28 b(it)c(is)g(p)s(ossible)e(to)k(write)0 3776 y(functions)j(that)i -(w)m(ork)f(with)f(a)i(v)-5 b(ariable)29 b(n)m(um)m(b)s(er)g(of)i -(parameters.)141 3889 y(T)-8 b(o)26 b(return)e(v)-5 b(alues,)27 -b(a)e(C)g(function)g(just)f(pushes)h(them)g(on)m(to)i(the)e(stac)m(k,)j -(in)d(direct)g(order)g(\(see)h(Section)f(5.2\).)0 4002 -y(Lik)m(e)30 b(a)h(Lua)f(function,)f(a)i(C)f(function)f(called)h(b)m(y) -g(Lua)g(can)h(also)f(return)f(man)m(y)i(results.)141 -4115 y(Section)f(8.9)i(presen)m(ts)e(an)g(example)g(of)h(a)g(CF)-8 -b(unction.)0 4358 y Ff(5.6)112 b(References)38 b(to)f(Lua)i(Ob)6 -b(jects)0 4530 y Fp(As)23 b(noted)g(in)f(Section)h(5.5,)j -Fn(lua_Object)p Fp(s)20 b(are)k(v)m(olatile.)38 b(If)22 -b(the)i(C)e(co)s(de)i(needs)e(to)i(k)m(eep)g(a)f Fn(lua_Object)e -Fp(outside)0 4642 y(blo)s(c)m(k)33 b(b)s(oundaries,)e(it)i(m)m(ust)g -(create)h(a)g Fo(r)-5 b(efer)g(enc)g(e)33 b Fp(to)h(the)f(ob)5 -b(ject.)50 b(The)33 b(routines)e(to)j(manipulate)e(references)0 -4755 y(are)f(the)f(follo)m(wing:)0 4943 y Fn(int)572 -b(lua_ref)46 b(\(int)g(lock\);)0 5056 y(lua_Object)236 -b(lua_getref)93 b(\(int)46 b(ref\);)0 5169 y(void)524 -b(lua_pushref)45 b(\(int)h(ref\);)0 5282 y(void)524 b(lua_unref)45 -b(\(int)i(ref\);)1905 5589 y Fp(14)p eop -%%Page: 15 15 -15 14 bop 0 91 a Fp(The)29 b(function)e Fn(lua_ref)g -Fp(creates)k(a)e(reference)h(to)g(the)f(ob)5 b(ject)30 -b(that)g(is)e(on)h(the)g(top)g(of)g(the)h(stac)m(k,)h(and)d(returns)0 -204 y(this)39 b(reference.)69 b(If)39 b Fn(lock)g Fp(is)g(true,)j(the)e -(ob)5 b(ject)41 b(is)e Fo(lo)-5 b(cke)g(d)p Fp(:)61 b(that)40 -b(means)g(the)g(ob)5 b(ject)40 b(will)d(not)k(b)s(e)e(garbage)0 -317 y(collected.)54 b(Notice)35 b(that)h(an)e(unlo)s(c)m(k)m(ed)g -(reference)h(ma)m(y)g(b)s(e)f(garbage)i(collected.)54 -b(Whenev)m(er)35 b(the)g(referenced)0 430 y(ob)5 b(ject)39 -b(is)d(needed,)k(a)e(call)f(to)i Fn(lua_getref)34 b Fp(returns)j(a)h -(handle)e(to)j(it,)g(whereas)f Fn(lua_pushref)c Fp(pushes)j(the)0 -543 y(ob)5 b(ject)29 b(on)f(the)h(stac)m(k.)41 b(If)28 -b(the)g(ob)5 b(ject)29 b(has)f(b)s(een)g(collected,)h(then)f -Fn(lua_getref)d Fp(returns)i Fn(LUA_NOOBJECT)p Fp(,)f(and)0 -656 y Fn(lua_pushobject)g Fp(issues)k(an)g(error.)141 -769 y(When)g(a)h(reference)g(is)e(no)i(longer)f(needed,)g(it)g(can)g(b) -s(e)g(freed)g(with)f(a)i(call)f(to)h Fn(lua_unref)p Fp(.)0 -1055 y Fq(6)135 b(Prede\014ned)44 b(F)-11 b(unctions)44 -b(and)h(Libraries)0 1258 y Fp(The)33 b(set)g(of)g(prede\014ned)f -(functions)f(in)h(Lua)h(is)f(small)g(but)g(p)s(o)m(w)m(erful.)47 -b(Most)34 b(of)g(them)f(pro)m(vide)f(features)h(that)0 -1371 y(allo)m(ws)28 b(some)i(degree)g(of)f(re\015exivit)m(y)g(in)e(the) -j(language.)40 b(Some)30 b(of)f(these)h(features)f(cannot)h(b)s(e)e -(sim)m(ulated)g(with)0 1484 y(the)k(rest)g(of)g(the)g(Language)h(nor)e -(with)g(the)h(standard)f(Lua)g(API.)h(Others)f(are)i(just)e(con)m(v)m -(enien)m(t)i(in)m(terfaces)f(to)0 1597 y(common)f(API)f(functions.)141 -1710 y(The)d(libraries,)e(on)i(the)g(other)h(hand,)f(pro)m(vide)f -(useful)g(routines)g(that)h(are)h(implemen)m(ted)e(directly)g(through)0 -1823 y(the)f(standard)f(API.)i(Therefore,)g(they)f(are)g(not)h -(necessary)f(to)h(the)f(language,)i(and)d(are)i(pro)m(vided)d(as)i -(separated)0 1936 y(C)30 b(mo)s(dules.)39 b(Curren)m(tly)29 -b(there)h(are)h(three)f(standard)g(libraries:)136 2123 -y Fk(\017)46 b Fp(string)30 b(manipulation;)136 2311 -y Fk(\017)46 b Fp(mathematical)31 b(functions)e(\(sin,)g(cos,)j(etc\);) -136 2499 y Fk(\017)46 b Fp(input)29 b(and)g(output)h(\(plus)f(some)i -(system)g(facilities\).)0 2686 y(In)h(order)g(to)h(ha)m(v)m(e)h(access) -f(to)g(these)g(libraries,)e(the)h(host)h(program)f(m)m(ust)g(call)g -(the)h(functions)e Fn(strlib_open)p Fp(,)0 2799 y Fn(mathlib_open)p -Fp(,)c(and)j Fn(iolib_open)p Fp(,)e(declared)i(in)f Fn(lualib.h)p -Fp(.)0 3042 y Ff(6.1)112 b(Prede\014ned)38 b(F)-9 b(unctions)0 -3214 y Fk(\017)35 b Fn(dofile)46 b(\(filename\))0 3386 -y Fp(This)33 b(function)g(receiv)m(es)i(a)g(\014le)e(name,)j(op)s(ens)d -(it,)j(and)d(executes)j(its)e(con)m(ten)m(ts)i(as)f(a)g(Lua)f(c)m(h)m -(unk,)h(or)g(as)f(pre-)0 3499 y(compiled)d(c)m(h)m(unks.)46 -b(When)32 b(called)g(without)f(argumen)m(ts,)j(it)e(executes)h(the)g -(con)m(ten)m(ts)h(of)f(the)f(standard)g(input)0 3612 -y(\()p Fn(stdin)p Fp(\).)60 b(If)37 b(there)g(is)f(an)m(y)h(error)g -(executing)g(the)g(\014le,)h(it)f(returns)f Fm(nil)p -Fp(.)60 b(Otherwise,)38 b(it)f(returns)e(the)j(v)-5 b(alues)0 -3724 y(returned)32 b(b)m(y)g(the)h(c)m(h)m(unk,)h(or)f(a)g(non)f -Fm(nil)h Fp(v)-5 b(alue)32 b(if)g(the)h(c)m(h)m(unk)g(returns)e(no)i(v) --5 b(alues.)47 b(It)33 b(issues)f(an)h(error)f(when)0 -3837 y(called)e(with)f(a)h(non)g(string)g(argumen)m(t.)0 -4077 y Fk(\017)35 b Fn(dostring)46 b(\(string\))0 4249 -y Fp(This)29 b(function)h(executes)j(a)e(giv)m(en)g(string)f(as)i(a)f -(Lua)g(c)m(h)m(unk.)43 b(If)30 b(there)i(is)e(an)m(y)h(error)g -(executing)h(the)f(string,)f(it)0 4362 y(returns)c Fm(nil)p -Fp(.)40 b(Otherwise,)27 b(it)h(returns)e(the)i(v)-5 b(alues)27 -b(returned)f(b)m(y)i(the)g(c)m(h)m(unk,)g(or)g(a)g(non)f -Fm(nil)h Fp(v)-5 b(alue)27 b(if)f(the)i(c)m(h)m(unk)0 -4475 y(returns)h(no)h(v)-5 b(alues.)0 4715 y Fk(\017)35 -b Fn(next)47 b(\(table,)f(index\))0 4887 y Fp(This)34 -b(function)g(allo)m(ws)h(a)h(program)f(to)h(tra)m(v)m(erse)h(all)d -(\014elds)g(of)i(a)g(table.)56 b(Its)35 b(\014rst)g(argumen)m(t)h(is)e -(a)i(table)g(and)0 5000 y(its)31 b(second)g(argumen)m(t)h(is)e(an)i -(index)d(in)i(this)f(table.)43 b(It)32 b(returns)e(the)h(next)h(index)e -(of)h(the)h(table)f(and)g(the)g(v)-5 b(alue)0 5112 y(asso)s(ciated)33 -b(with)d(the)j(index.)44 b(When)32 b(called)f(with)g -Fm(nil)h Fp(as)h(its)e(second)h(argumen)m(t,)i(the)e(function)f -(returns)g(the)0 5225 y(\014rst)g(index)g(of)h(the)g(table)g(\(and)g -(its)f(asso)s(ciated)i(v)-5 b(alue\).)45 b(When)32 b(called)f(with)g -(the)h(last)g(index,)f(or)h(with)f Fm(nil)h Fp(in)0 5338 -y(an)e(empt)m(y)h(table,)g(it)e(returns)h Fm(nil)p Fp(.)1905 -5589 y(15)p eop -%%Page: 16 16 -16 15 bop 141 91 a Fp(In)32 b(Lua)f(there)i(is)e(no)h(declaration)g(of) -g(\014elds;)g(seman)m(tically)-8 b(,)32 b(there)h(is)e(no)h -(di\013erence)g(b)s(et)m(w)m(een)g(a)h(\014eld)e(not)0 -204 y(presen)m(t)i(in)e(a)i(table)f(or)g(a)h(\014eld)e(with)h(v)-5 -b(alue)32 b Fm(nil)p Fp(.)47 b(Therefore,)33 b(the)f(function)g(only)f -(considers)g(\014elds)g(with)h(non)0 317 y(nil)c(v)-5 -b(alues.)40 b(The)30 b(order)g(the)h(indices)d(are)j(en)m(umerated)g -(is)e(not)i(sp)s(eci\014ed,)e Fo(even)j(for)h(numeric)f(indic)-5 -b(es)p Fp(.)141 430 y(See)31 b(Section)f(8.2)h(for)g(an)f(example)g(of) -g(the)h(use)f(of)h(this)e(function.)0 670 y Fk(\017)35 -b Fn(nextvar)46 b(\(name\))0 842 y Fp(This)40 b(function)g(is)h -(similar)e(to)k(the)f(function)e Fn(next)p Fp(,)k(but)d(iterates)i(o)m -(v)m(er)g(the)f(global)f(v)-5 b(ariables.)74 b(Its)41 -b(single)0 955 y(argumen)m(t)31 b(is)f(the)h(name)g(of)g(a)g(global)f -(v)-5 b(ariable,)30 b(or)h Fm(nil)g Fp(to)g(get)h(a)f(\014rst)f(name.) -42 b(Similarly)27 b(to)32 b Fn(next)p Fp(,)e(it)g(returns)0 -1068 y(the)k(name)g(of)g(another)g(v)-5 b(ariable)33 -b(and)g(its)h(v)-5 b(alue,)34 b(or)g Fm(nil)g Fp(if)f(there)h(are)g(no) -g(more)g(v)-5 b(ariables.)50 b(See)34 b(Section)g(8.2)0 -1181 y(for)c(an)g(example)g(of)h(the)g(use)f(of)g(this)f(function.)0 -1421 y Fk(\017)35 b Fn(tostring)46 b(\(e\))0 1592 y Fp(This)29 -b(function)g(receiv)m(es)i(an)f(argumen)m(t)h(of)f(an)m(y)h(t)m(yp)s(e) -g(and)e(con)m(v)m(erts)j(it)e(to)h(a)g(string)e(in)g(a)i(reasonable)f -(format.)0 1832 y Fk(\017)35 b Fn(print)47 b(\(e1,)f(e2,)h(...\))0 -2004 y Fp(This)35 b(function)g(receiv)m(es)i(an)m(y)f(n)m(um)m(b)s(er)f -(of)i(argumen)m(ts,)h(and)e(prin)m(ts)f(their)g(v)-5 -b(alues)36 b(in)f(a)h(reasonable)g(format.)0 2117 y(Eac)m(h)i(v)-5 -b(alue)37 b(is)f(prin)m(ted)g(in)h(a)g(new)g(line.)61 -b(This)35 b(function)h(is)h(not)g(in)m(tended)g(for)g(formatted)h -(output,)h(but)e(as)0 2230 y(a)j(quic)m(k)e(w)m(a)m(y)j(to)f(sho)m(w)f -(a)g(v)-5 b(alue,)42 b(for)d(instance)g(for)g(error)f(messages)j(or)e -(debugging.)66 b(See)40 b(Section)f(6.4)h(for)0 2343 -y(functions)29 b(for)h(formatted)h(output.)0 2583 y Fk(\017)k -Fn(tonumber)46 b(\(e\))0 2754 y Fp(This)19 b(function)g(receiv)m(es)j -(one)f(argumen)m(t,)i(and)e(tries)f(to)h(con)m(v)m(ert)i(it)d(to)h(a)h -(n)m(um)m(b)s(er.)36 b(If)20 b(the)h(argumen)m(t)g(is)f(already)h(a)0 -2867 y(n)m(um)m(b)s(er)g(or)h(a)g(string)f(con)m(v)m(ertible)h(to)h(a)f -(n)m(um)m(b)s(er)f(\(see)i(Section)f(4.2\),)j(then)d(it)f(returns)g -(that)i(n)m(um)m(b)s(er;)g(otherwise,)0 2980 y(it)30 -b(returns)f Fm(nil)p Fp(.)0 3220 y Fk(\017)35 b Fn(type)47 -b(\(v\))0 3392 y Fp(This)25 b(function)g(allo)m(ws)h(Lua)g(to)i(test)f -(the)g(t)m(yp)s(e)g(of)f(a)h(v)-5 b(alue.)39 b(It)27 -b(receiv)m(es)g(one)g(argumen)m(t,)h(and)e(returns)g(its)g(t)m(yp)s(e,) -0 3505 y(co)s(ded)38 b(as)h(a)g(string.)65 b(The)38 b(p)s(ossible)e -(results)h(of)i(this)f(function)f(are)i Fn("nil")e Fp(\(a)j(string,)f -(not)g(the)g(v)-5 b(alue)38 b Fm(nil)p Fp(\),)0 3618 -y Fn("number")p Fp(,)h Fn("string")p Fp(,)g Fn("table")p -Fp(,)g Fn("function")d Fp(\(returned)i(b)s(oth)g(for)h(C)g(functions)e -(and)h(Lua)h(functions\),)0 3731 y(and)30 b Fn("userdata")p -Fp(.)141 3844 y(Besides)f(this)f(string,)g(the)i(function)d(returns)h -(a)i(second)f(result,)f(whic)m(h)g(is)g(the)i Fo(tag)f -Fp(of)g(the)h(v)-5 b(alue.)39 b(This)28 b(tag)0 3957 -y(can)g(b)s(e)e(used)h(to)h(distinguish)23 b(b)s(et)m(w)m(een)28 -b(user)f(data)h(with)d(di\013eren)m(t)i(tags,)i(and)e(b)s(et)m(w)m(een) -h(C)f(functions)f(and)g(Lua)0 4069 y(functions.)0 4310 -y Fk(\017)35 b Fn(assert)46 b(\(v\))0 4481 y Fp(This)29 -b(function)g(issues)g(an)h Fo(\\assertion)k(faile)-5 -b(d!")41 b Fp(error)30 b(when)f(its)h(argumen)m(t)h(is)e -Fm(nil)p Fp(.)0 4721 y Fk(\017)35 b Fn(error)47 b(\(message\))0 -4893 y Fp(This)41 b(function)h(issues)g(an)h(error)f(message)i(and)f -(terminates)g(the)g(last)g(called)f(function)g(from)g(the)h(library)0 -5006 y(\()p Fn(lua_dofile)p Fp(,)28 b Fn(lua_dostring)p -Fp(,)f(.)16 b(.)f(.)h(\).)41 b(It)30 b(nev)m(er)h(returns.)1905 -5589 y(16)p eop -%%Page: 17 17 -17 16 bop 0 91 a Fk(\017)35 b Fn(setglobal)46 b(\(name,)g(value\))0 -263 y Fp(This)35 b(function)h(assigns)f(the)i(giv)m(en)g(v)-5 -b(alue)37 b(to)g(a)g(global)f(v)-5 b(ariable.)59 b(The)37 -b(string)e Fn(name)h Fp(do)s(es)g(not)h(need)g(to)h(b)s(e)0 -376 y(a)33 b(syn)m(tactically)g(v)-5 b(alid)31 b(v)-5 -b(ariable)32 b(name.)48 b(Therefore,)33 b(this)f(function)g(can)h(set)g -(global)f(v)-5 b(ariables)32 b(with)f(strange)0 489 y(names)f(lik)m(e)g -Fn(`m)47 b(v)h(1')29 b Fp(or)i Fn(34)p Fp(.)40 b(It)30 -b(returns)f(the)i(v)-5 b(alue)30 b(of)g(its)g(second)h(argumen)m(t.)0 -729 y Fk(\017)k Fn(getglobal)46 b(\(name\))0 901 y Fp(This)41 -b(function)g(retriev)m(es)i(the)g(v)-5 b(alue)42 b(of)g(a)h(global)f(v) --5 b(ariable.)76 b(The)42 b(string)g Fn(name)f Fp(do)s(es)h(not)h(need) -f(to)i(b)s(e)e(a)0 1013 y(syn)m(tactically)30 b(v)-5 -b(alid)29 b(v)-5 b(ariable)29 b(name.)0 1254 y Fk(\017)35 -b Fn(setfallback)45 b(\(fallbackname,)f(newfallback\))0 -1425 y Fp(This)23 b(function)h(sets)i(a)f(new)g(fallbac)m(k)g(function) -f(to)h(the)h(giv)m(en)f(fallbac)m(k.)38 b(It)26 b(returns)e(the)h(old)f -(fallbac)m(k)h(function.)0 1669 y Ff(6.2)112 b(String)37 -b(Manipulation)0 1840 y Fp(This)26 b(library)f(pro)m(vides)h(generic)i -(functions)e(for)h(string)f(manipulation,)g(suc)m(h)h(as)h(\014nding)d -(and)i(extracting)h(sub-)0 1953 y(strings)40 b(and)g(pattern)h(matc)m -(hing.)72 b(When)41 b(indexing)d(a)j(string,)i(the)e(\014rst)f(c)m -(haracter)j(has)d(p)s(osition)f(1.)73 b(See)0 2066 y(P)m(age)30 -b(19)f(for)g(an)f(explanation)f(ab)s(out)i(patterns,)g(and)e(Section)i -(8.3)g(for)f(some)h(examples)f(on)h(string)e(manipula-)0 -2179 y(tion)j(in)f(Lua.)0 2419 y Fk(\017)35 b Fn(strfind)46 -b(\(str,)g(pattern)g([,)h(init)g([,)g(plain]]\))0 2591 -y Fp(This)35 b(function)g(lo)s(oks)h(for)g(the)h(\014rst)e -Fo(match)j Fp(of)f Fn(pattern)d Fp(in)i Fn(str)p Fp(.)58 -b(If)36 b(it)g(\014nds)f(one,)j(it)e(returns)f(the)i(indexes)0 -2704 y(on)j Fn(str)f Fp(where)g(this)g(o)s(ccurence)i(starts)f(and)f -(ends;)45 b(otherwise,)d(it)d(returns)g Fm(nil)p Fp(.)70 -b(If)39 b(the)h(pattern)g(sp)s(eci\014es)0 2817 y(captures,)32 -b(the)f(captured)h(strings)e(are)i(returned)e(as)h(extra)h(results.)43 -b(A)31 b(third)f(optional)h(n)m(umerical)e(argumen)m(t)0 -2929 y(sp)s(eci\014es)f(where)g(to)i(start)f(the)g(searc)m(h;)h(its)f -(default)f(v)-5 b(alue)28 b(is)g(1.)41 b(A)29 b(v)-5 -b(alue)28 b(of)h(1)g(as)h(a)f(forth)f(optional)g(argumen)m(t)0 -3042 y(turns)h(o\013)i(the)f(pattern)h(matc)m(hing)f(facilities,)f(so)i -(the)f(function)f(do)s(es)i(a)f(plain)f(\\\014nd)g(substring")g(op)s -(eration.)0 3282 y Fk(\017)35 b Fn(strlen)46 b(\(s\))0 -3454 y Fp(Receiv)m(es)31 b(a)g(string)e(and)h(returns)f(its)h(length.)0 -3694 y Fk(\017)35 b Fn(strsub)46 b(\(s,)h(i)h([,)f(j]\))0 -3866 y Fp(Returns)32 b(another)g(string,)h(whic)m(h)e(is)g(a)i -(substring)e(of)h Fn(s)p Fp(,)h(starting)f(at)i Fn(i)e -Fp(and)g(runing)e(un)m(til)h Fn(j)p Fp(.)46 b(If)32 b -Fn(j)h Fp(is)e(absen)m(t,)0 3979 y(it)d(is)g(assumed)f(to)j(b)s(e)e -(equal)g(to)h(the)g(length)f(of)g Fn(s)p Fp(.)40 b(In)28 -b(particular,)f(the)i(call)f Fn(strsub\(s,1,j\))d Fp(returns)i(a)i -(pre\014x)0 4092 y(of)i Fn(s)f Fp(with)f(length)g Fn(j)p -Fp(,)i(whereas)f(the)g(call)g Fn(strsub\(s,i\))d Fp(returns)j(a)g -(su\016x)g(of)g Fn(s)p Fp(,)h(starting)f(at)h Fn(i)p -Fp(.)0 4332 y Fk(\017)k Fn(strlower)46 b(\(s\))0 4503 -y Fp(Receiv)m(es)26 b(a)g(string)f(and)g(returns)f(a)i(cop)m(y)g(of)f -(that)h(string)f(with)f(all)g(upp)s(er)g(case)i(letters)g(c)m(hanged)g -(to)g(lo)m(w)m(er)g(case.)0 4616 y(All)j(other)i(c)m(haracters)g(are)g -(left)f(unc)m(hanged.)0 4856 y Fk(\017)35 b Fn(strupper)46 -b(\(s\))0 5028 y Fp(Receiv)m(es)26 b(a)g(string)f(and)g(returns)f(a)i -(cop)m(y)g(of)f(that)h(string)f(with)f(all)g(lo)m(w)m(er)i(case)g -(letters)g(c)m(hanged)g(to)g(upp)s(er)e(case.)0 5141 -y(All)29 b(other)i(c)m(haracters)g(are)g(left)f(unc)m(hanged.)1905 -5589 y(17)p eop -%%Page: 18 18 -18 17 bop 0 91 a Fk(\017)35 b Fn(strrep)46 b(\(s,)h(n\))0 -263 y Fp(Returns)29 b(a)i(string)f(whic)m(h)f(is)g(the)i(concatenation) -g(of)g Fn(n)f Fp(copies)g(of)h(the)f(string)g Fn(s)p -Fp(.)0 503 y Fk(\017)35 b Fn(ascii)47 b(\(s)g([,)g(i]\))0 -675 y Fp(Returns)29 b(the)i(ascii)f(co)s(de)g(of)h(the)f(c)m(haracter)i -Fn(s[i])p Fp(.)40 b(If)30 b Fn(i)g Fp(is)f(absen)m(t,)i(then)f(it)g(is) -g(assumed)f(to)i(b)s(e)f(1.)0 915 y Fk(\017)35 b Fn(format)46 -b(\(formatstring,)e(e1,)j(e2,)g(...\))0 1086 y Fp(This)25 -b(function)h(returns)g(a)h(formated)g(v)m(ersion)g(of)g(its)f(v)-5 -b(ariable)26 b(n)m(um)m(b)s(er)g(of)h(argumen)m(ts)g(follo)m(wing)f -(the)h(descrip-)0 1199 y(tion)i(giv)m(en)h(in)e(its)h(\014rst)g -(argumen)m(t)h(\(whic)m(h)f(m)m(ust)g(b)s(e)g(a)h(string\).)40 -b(The)29 b(format)h(string)f(follo)m(ws)g(the)g(same)h(rules)0 -1312 y(as)h(the)f Fn(printf)f Fp(family)g(of)h(standard)g(C)g -(functions.)40 b(The)30 b(only)f(di\013erences)h(are)h(that)g(the)f -(options/mo)s(di\014ers)0 1425 y Fn(*)p Fp(,)42 b Fn(l)p -Fp(,)f Fn(L)p Fp(,)e Fn(n)p Fp(,)j Fn(p)p Fp(,)f(and)e -Fn(h)g Fp(are)h(not)g(supp)s(orted,)g(and)e(there)i(is)e(an)i(extra)g -(option,)h Fn(q)p Fp(.)68 b(This)37 b(option)i(formats)h(a)0 -1538 y(string)27 b(in)f(a)i(form)g(suitable)e(to)i(b)s(e)g(safely)f -(read)h(bac)m(k)g(b)m(y)g(the)g(Lua)f(in)m(terpreter;)h(that)h(is,)e -(the)h(string)f(is)g(written)0 1651 y(b)s(et)m(w)m(een)34 -b(double)e(quotes,)j(and)e(all)g(double)f(quotes,)j(returns)d(and)h -(bac)m(kslashes)h(in)e(the)i(string)f(are)h(correctly)0 -1764 y(escap)s(ed)c(when)g(written.)40 b(F)-8 b(or)31 -b(instance,)f(the)h(call)0 1952 y Fn(format\('\045q',)44 -b('a)k(string)e(with)g("quotes")g(and)h(\\n)g(new)g(line'\))0 -2139 y Fp(will)28 b(pro)s(duce)h(the)h(string:)0 2327 -y Fn("a)47 b(string)f(with)h(\\"quotes\\")e(and)i(\\)48 -2440 y(new)g(line")141 2627 y Fp(The)29 b(options)g Fn(c)p -Fp(,)g Fn(d)p Fp(,)h Fn(E)p Fp(,)f Fn(e)p Fp(,)h Fn(f)p -Fp(,)f Fn(g)g(i)p Fp(,)h Fn(o)p Fp(,)f Fn(u)p Fp(,)h -Fn(X)p Fp(,)f(and)g Fn(x)g Fp(all)f(exp)s(ect)i(a)g(n)m(um)m(b)s(er)e -(as)i(argumen)m(t,)g(whereas)f Fn(q)g Fp(and)g Fn(s)0 -2740 y Fp(exp)s(ect)i(a)g(string.)0 2980 y Fk(\017)k -Fn(gsub)47 b(\(s,)g(pat,)f(repl)h([,)g(n]\))0 3152 y -Fp(Returns)37 b(a)h(cop)m(y)h(of)f Fn(s)p Fp(,)i(where)e(all)f(o)s -(ccurrences)h(of)g(the)g(pattern)g Fn(pat)f Fp(ha)m(v)m(e)j(b)s(een)d -(replaced)g(b)m(y)h(a)h(replace-)0 3265 y(men)m(t)34 -b(string)e(sp)s(eci\014ed)g(b)m(y)i Fn(repl)p Fp(.)49 -b(This)31 b(function)i(also)g(returns,)g(as)h(a)g(second)g(v)-5 -b(alue,)34 b(the)f(total)i(n)m(um)m(b)s(er)d(of)0 3378 -y(substitutions)c(made.)141 3491 y(If)h Fn(repl)f Fp(is)g(a)h(string,)g -(its)f(v)-5 b(alue)29 b(is)f(used)g(for)h(replacemen)m(t.)41 -b(An)m(y)29 b(sequence)h(in)e Fn(repl)g Fp(of)h(the)g(form)g -Fn(\045n)f Fp(with)0 3604 y Fn(n)i Fp(b)s(et)m(w)m(een)h(1)g(and)f(9)g -(stands)g(for)g(the)h(v)-5 b(alue)30 b(of)g(the)h(n-th)f(captured)g -(substring.)141 3717 y(If)44 b Fn(repl)f Fp(is)g(a)i(function,)i(this)c -(function)g(is)g(called)h(ev)m(ery)h(time)f(a)g(matc)m(h)h(o)s(ccurs,)j -(with)43 b(all)g(captured)0 3829 y(substrings)f(as)i(parameters.)82 -b(If)43 b(the)h(v)-5 b(alue)44 b(returned)f(b)m(y)g(this)g(function)g -(is)g(a)h(string,)j(it)c(is)g(used)h(as)g(the)0 3942 -y(replacemen)m(t)31 b(string;)e(otherwise,)h(the)h(replacemen)m(t)g -(string)e(is)h(the)g(empt)m(y)h(string.)141 4055 y(An)h(optional)g -(parameter)g Fn(n)g Fp(limits)e(the)j(maxim)m(um)e(n)m(um)m(b)s(er)g -(of)i(substitutions)c(to)34 b(o)s(ccur.)46 b(F)-8 b(or)33 -b(instance,)0 4168 y(when)c Fn(n)h Fp(is)g(1)h(only)e(the)i(\014rst)e -(o)s(ccurrence)i(of)f Fn(pat)g Fp(is)f(replaced.)141 -4281 y(As)24 b(an)f(example,)i(in)d(the)i(follo)m(wing)e(expression)g -(eac)m(h)j(o)s(ccurrence)f(of)f(the)h(form)f Fn($name$)f -Fp(calls)h(the)g(function)0 4394 y Fn(getenv)p Fp(,)32 -b(passing)f Fn(name)g Fp(as)i(argumen)m(t)g(\(b)s(ecause)g(only)f(this) -f(part)i(of)f(the)h(pattern)g(is)e(captured\).)47 b(The)32 -b(v)-5 b(alue)0 4507 y(returned)29 b(b)m(y)h Fn(getenv)f -Fp(will)f(replace)i(the)h(pattern.)41 b(Therefore,)30 -b(the)h(whole)e(expression:)95 4695 y Fn(gsub\("home)45 -b(=)j($HOME$,)e(user)g(=)i($USER$",)d("$\(\045w\045w*\)$",)g(getenv\))0 -4882 y Fp(ma)m(y)31 b(return)e(the)i(string:)0 5070 y -Fn(home)47 b(=)g(/home/roberto,)d(user)j(=)g(roberto)1905 -5589 y Fp(18)p eop -%%Page: 19 19 -19 18 bop 0 91 a Fm(P)m(atterns)0 263 y(Character)52 -b(Class:)90 b Fp(a)46 b Fo(char)-5 b(acter)49 b(class)d -Fp(is)e(used)h(to)h(represen)m(t)g(a)g(set)g(of)f(c)m(haracters.)88 -b(The)44 b(follo)m(wing)0 376 y(com)m(binations)30 b(are)g(allo)m(w)m -(ed)h(in)e(describing)f(a)i(c)m(haracter)i(class:)0 563 -y Fo(x)46 b Fp(\(where)30 b Fo(x)g Fp(is)g(an)m(y)g(c)m(haracter)i(not) -f(in)e(the)i(list)e Fn(\(\)\045.[*?)p Fp(\))f(|)j(represen)m(ts)f(the)h -(c)m(haracter)g Fo(x)g Fp(itself.)0 751 y Fn(.)45 b Fp(|)30 -b(represen)m(ts)h(all)e(c)m(haracters.)0 939 y Fn(\045a)45 -b Fp(|)30 b(represen)m(ts)g(all)g(letters.)0 1126 y Fn(\045A)45 -b Fp(|)30 b(represen)m(ts)g(all)g(non)f(letter)i(c)m(haracters.)0 -1314 y Fn(\045d)45 b Fp(|)30 b(represen)m(ts)g(all)g(digits.)0 -1502 y Fn(\045D)45 b Fp(|)30 b(represen)m(ts)g(all)g(non)f(digits.)0 -1689 y Fn(\045l)45 b Fp(|)30 b(represen)m(ts)g(all)g(lo)m(w)m(er)g -(case)i(letters.)0 1877 y Fn(\045L)45 b Fp(|)30 b(represen)m(ts)g(all)g -(non)f(lo)m(w)m(er)i(case)g(letter)g(c)m(haracters.)0 -2065 y Fn(\045s)45 b Fp(|)30 b(represen)m(ts)g(all)g(space)h(c)m -(haracters.)0 2252 y Fn(\045S)45 b Fp(|)30 b(represen)m(ts)g(all)g(non) -f(space)i(c)m(haracters.)0 2440 y Fn(\045u)45 b Fp(|)30 -b(represen)m(ts)g(all)g(upp)s(er)e(case)j(letters.)0 -2627 y Fn(\045U)45 b Fp(|)30 b(represen)m(ts)g(all)g(non)f(upp)s(er)g -(case)i(letter)g(c)m(haracters.)0 2815 y Fn(\045w)45 -b Fp(|)30 b(represen)m(ts)g(all)g(alphan)m(umeric)e(c)m(haracters.)0 -3003 y Fn(\045W)45 b Fp(|)30 b(represen)m(ts)g(all)g(non)f(alphan)m -(umeric)g(c)m(haracters.)0 3190 y Fn(\045)p Fo(x)45 b -Fp(\(where)31 b Fo(x)f Fp(is)f(an)m(y)i(non)f(alphan)m(umeric)e(c)m -(haracter\))33 b(|)d(represen)m(ts)g(the)h(c)m(haracter)h -Fo(x)p Fp(.)0 3378 y Fn([char-set])43 b Fp(|)27 b(Represen)m(ts)g(the)g -(class)g(whic)m(h)f(is)g(the)h(union)f(of)h(all)f(c)m(haracters)j(in)c -(c)m(har-set.)41 b(T)-8 b(o)28 b(include)d(a)i Fn(])227 -3491 y Fp(in)21 b(c)m(har-set,)26 b(it)21 b(m)m(ust)i(b)s(e)e(the)i -(\014rst)e(c)m(haracter.)40 b(A)22 b(range)h(of)f(c)m(haracters)i(ma)m -(y)f(b)s(e)e(sp)s(eci\014ed)g(b)m(y)h(separating)227 -3604 y(the)35 b(end)f(c)m(haracters)i(of)f(the)g(range)g(with)e(a)i -Fn(-)p Fp(;)i(e.g.,)g Fn(A-Z)d Fp(sp)s(eci\014es)f(the)i(upp)s(er)d -(case)k(c)m(haracters.)55 b(If)34 b Fn(-)227 3717 y Fp(app)s(ears)43 -b(as)g(the)g(\014rst)g(or)g(last)g(c)m(haracter)h(of)f(c)m(har-set,)48 -b(then)43 b(it)g(represen)m(ts)g(itself.)77 b(All)42 -b(classes)h Fn(\045)p Fo(x)227 3830 y Fp(describ)s(ed)31 -b(ab)s(o)m(v)m(e)i(can)g(also)g(b)s(e)f(used)f(as)i(comp)s(onen)m(ts)g -(in)e(a)i(c)m(har-set.)48 b(All)31 b(other)i(c)m(haracters)h(in)d(c)m -(har-)227 3942 y(set)g(represen)m(t)g(themselv)m(es.)0 -4130 y Fn([^char-set])42 b Fp(|)31 b(represen)m(ts)f(the)h(complemen)m -(t)f(of)h(c)m(har-set,)h(where)d(c)m(har-set)j(is)e(in)m(terpreted)f -(as)i(ab)s(o)m(v)m(e.)0 4370 y Fm(P)m(attern)39 b(Item:)89 -b Fp(a)35 b Fo(p)-5 b(attern)38 b(item)c Fp(ma)m(y)h(b)s(e)e(a)i -(single)e(c)m(haracter)j(class,)f(or)f(a)h(c)m(haracter)g(class)f -(follo)m(w)m(ed)g(b)m(y)0 4483 y Fn(*)j Fp(or)g(b)m(y)h -Fn(?)p Fp(.)61 b(A)37 b(single)f(c)m(haracter)j(class)f(matc)m(hes)g -(an)m(y)g(single)e(c)m(haracter)j(in)d(the)h(class.)62 -b(A)37 b(c)m(haracter)i(class)0 4596 y(follo)m(w)m(ed)33 -b(b)m(y)g Fn(*)f Fp(matc)m(hes)j(0)e(or)g(more)h(rep)s(etitions)d(of)i -(c)m(haracters)i(in)d(the)h(class.)49 b(A)33 b(c)m(haracter)h(class)f -(follo)m(w)m(ed)0 4709 y(b)m(y)27 b Fn(?)g Fp(matc)m(hes)h(0)g(or)f -(one)h(o)s(ccurrence)f(of)g(a)h(c)m(haracter)h(in)d(the)h(class.)40 -b(A)27 b(pattern)g(item)g(ma)m(y)h(also)f(has)g(the)g(form)0 -4822 y Fn(\045n)p Fp(,)j(for)g Fn(n)g Fp(b)s(et)m(w)m(een)h(1)g(and)f -(9;)h(suc)m(h)f(item)g(matc)m(hes)h(a)g(sub-string)e(equal)h(to)h(the)f -(n-th)g(captured)g(string.)1905 5589 y(19)p eop -%%Page: 20 20 -20 19 bop 0 91 a Fm(P)m(attern:)91 b Fp(a)32 b Fo(p)-5 -b(attern)34 b Fp(is)d(a)i(sequence)f(of)g(pattern)h(items.)45 -b(An)m(y)32 b(rep)s(etition)f(item)h(\()p Fn(*)p Fp(\))g(inside)e(a)i -(pattern)h(will)0 204 y(alw)m(a)m(ys)f(matc)m(h)g(the)g(longest)f(p)s -(ossible)e(sequence.)44 b(A)32 b Fn(^)f Fp(at)h(the)f(b)s(eginning)e -(of)j(a)f(pattern)h(anc)m(hors)f(the)h(matc)m(h)0 317 -y(at)i(the)f(b)s(eginning)d(of)j(the)g(sub)5 b(ject)32 -b(string.)48 b(A)33 b Fn($)f Fp(at)i(the)f(end)f(of)h(a)g(pattern)g -(anc)m(hors)g(the)g(matc)m(h)h(at)g(the)f(end)0 430 y(of)e(the)f(sub)5 -b(ject)30 b(string.)141 543 y(A)35 b(pattern)g(ma)m(y)h(con)m(tain)g -(sub-patterns)e(enclosed)h(in)e(paren)m(theses,)k(that)f(describ)s(e)d -Fo(c)-5 b(aptur)g(es)p Fp(.)57 b(When)35 b(a)0 656 y(matc)m(h)g -(succeeds,)h(the)f(sub-strings)d(of)j(the)g(sub)5 b(ject)34 -b(string)f(that)i(matc)m(h)h(captures)e(are)h Fo(c)-5 -b(aptur)g(e)g(d)37 b Fp(for)d(future)0 769 y(use.)40 -b(Captures)30 b(are)h(n)m(um)m(b)s(ered)e(according)h(to)h(their)f -(left)g(paren)m(theses.)0 1012 y Ff(6.3)112 b(Mathematical)36 -b(F)-9 b(unctions)0 1184 y Fp(This)24 b(library)g(is)h(an)i(in)m -(terface)f(to)h(some)g(functions)e(of)h(the)g(standard)g(C)g(math)g -(library)-8 b(.)37 b(Moreo)m(v)m(er,)29 b(it)d(registers)0 -1297 y(a)31 b(fallbac)m(k)f(for)g(the)g(binary)f(op)s(erator)i -Fn(^)f Fp(whic)m(h,)f(when)g(applied)g(to)i(n)m(um)m(b)s(ers)e -Fn(x^y)p Fp(,)g(returns)g Fe(x)3321 1264 y Fd(y)3363 -1297 y Fp(.)141 1410 y(The)h(library)e(pro)m(vides)h(the)i(follo)m -(wing)e(functions:)0 1597 y Fn(abs)47 b(acos)g(asin)f(atan)h(atan2)f -(ceil)h(cos)g(floor)f(log)h(log10)0 1710 y(max)g(min)95 -b(mod)f(sin)h(sqrt)46 b(tan)h(random)f(randomseed)0 1898 -y Fp(Most)36 b(of)f(them)g(are)h(only)e(in)m(terfaces)i(to)g(the)f -(homon)m(ymous)g(functions)e(in)h(the)i(C)e(library)-8 -b(,)35 b(except)h(that,)h(for)0 2011 y(the)31 b(trigonometric)f -(functions,)f(all)g(angles)h(are)h(expressed)f(in)f(degrees,)i(not)g -(radians.)141 2124 y(The)22 b(function)g Fn(max)f Fp(returns)h(the)h -(maxim)m(um)e(v)-5 b(alue)22 b(of)h(its)f(n)m(umeric)f(argumen)m(ts.)39 -b(Similarly)-8 b(,)21 b Fn(min)h Fp(computes)0 2237 y(the)31 -b(minim)m(um.)37 b(Both)31 b(can)g(b)s(e)f(used)f(with)h(an)g -(unlimited)d(n)m(um)m(b)s(er)i(of)h(argumen)m(ts.)141 -2349 y(The)e(functions)e Fn(random)h Fp(and)g Fn(randomseed)e -Fp(are)k(in)m(terfaces)f(to)h(the)f(simple)e(random)h(generator)i -(functions)0 2462 y Fn(rand)35 b Fp(and)h Fn(srand)p -Fp(,)h(pro)m(vided)f(b)m(y)g(ANSI)g(C.)h(The)f(function)f -Fn(random)g Fp(returns)h(pseudo-random)f(n)m(um)m(b)s(ers)g(in)0 -2575 y(the)c(range)f([0)p Fe(;)15 b Fp(1\).)0 2819 y -Ff(6.4)112 b(I/O)38 b(F)-9 b(acilities)0 2990 y Fp(All)37 -b(I/O)i(op)s(erations)f(in)f(Lua)i(are)g(done)g(o)m(v)m(er)h(t)m(w)m(o) -g Fo(curr)-5 b(ent)39 b Fp(\014les:)57 b(one)39 b(for)f(reading)g(and)g -(one)h(for)g(writing.)0 3103 y(Initially)-8 b(,)28 b(the)j(curren)m(t)f -(input)e(\014le)i(is)f Fn(stdin)p Fp(,)g(and)h(the)h(curren)m(t)f -(output)g(\014le)f(is)h Fn(stdout)p Fp(.)141 3216 y(Unless)k(otherwise) -f(stated,)k(all)c(I/O)h(functions)f(return)h Fm(nil)g -Fp(on)g(failure)f(and)h(some)h(v)-5 b(alue)34 b(di\013eren)m(t)f(from)0 -3329 y Fm(nil)d Fp(on)h(success.)0 3569 y Fk(\017)k Fn(readfrom)46 -b(\(filename\))0 3741 y Fp(This)29 b(function)g(ma)m(y)j(b)s(e)e -(called)g(in)f(three)i(w)m(a)m(ys.)42 b(When)31 b(called)f(with)f(a)i -(\014le)f(name,)h(it)g(op)s(ens)e(the)i(named)g(\014le,)0 -3854 y(sets)25 b(it)e(as)i(the)f Fo(curr)-5 b(ent)25 -b Fp(input)d(\014le,)j(and)f(returns)f(a)h Fo(hand)5 -b(le)25 b Fp(to)g(the)g(\014le)e(\(this)g(handle)g(is)g(a)i(user)e -(data)i(con)m(taining)0 3967 y(the)37 b(\014le)f(stream)h -Fn(FILE)47 b(*)p Fp(\).)60 b(When)37 b(called)f(with)f(a)j(\014le)e -(handle,)h(returned)f(b)m(y)g(a)i(previous)d(call,)j(it)e(restores)0 -4080 y(the)31 b(\014le)e(as)i(the)f(curren)m(t)g(input.)39 -b(When)30 b(called)g(without)f(parameters,)i(it)f(closes)h(the)f -(curren)m(t)g(input)f(\014le,)h(and)0 4192 y(restores)h -Fn(stdin)e Fp(as)h(the)h(curren)m(t)f(input)f(\014le.)141 -4305 y(If)h(this)f(function)g(fails,)h(it)f(returns)h -Fm(nil)p Fp(,)g(plus)f(a)h(string)g(describing)e(the)i(error.)141 -4418 y Fo(System)i(dep)-5 b(endent:)41 b Fp(if)27 b Fn(filename)f -Fp(starts)j(with)e(a)i Fn(|)p Fp(,)g(then)f(a)h(pip)s(ed)d(input)g(is)i -(op)s(en,)g(via)g(function)f Fn(popen)p Fp(.)0 4658 y -Fk(\017)35 b Fn(writeto)46 b(\(filename\))0 4830 y Fp(This)38 -b(function)g(ma)m(y)i(b)s(e)f(called)g(in)g(three)g(w)m(a)m(ys.)70 -b(When)39 b(called)g(with)f(a)j(\014le)d(name,)43 b(it)c(op)s(ens)g -(the)g(named)0 4943 y(\014le,)c(sets)h(it)e(as)h(the)g -Fo(curr)-5 b(ent)36 b Fp(output)e(\014le,)i(and)e(returns)f(a)j -Fo(hand)5 b(le)36 b Fp(to)f(the)g(\014le)f(\(this)g(handle)g(is)g(a)h -(user)f(data)0 5056 y(con)m(taining)24 b(the)g(\014le)f(stream)i -Fn(FILE)46 b(*)p Fp(\).)39 b(Notice)25 b(that,)h(if)d(the)i(\014le)e -(already)h(exists,)h(it)f(will)d(b)s(e)j Fo(c)-5 b(ompletely)28 -b(er)-5 b(ase)g(d)0 5169 y Fp(with)28 b(this)g(op)s(eration.)40 -b(When)28 b(called)h(with)f(a)h(\014le)f(handle,)g(returned)g(b)m(y)h -(a)h(previous)d(call,)i(it)g(restores)h(the)f(\014le)1905 -5589 y(20)p eop -%%Page: 21 21 -21 20 bop 0 91 a Fp(as)37 b(the)g(curren)m(t)g(output.)59 -b(When)37 b(called)f(without)g(parameters,)j(this)c(function)h(closes)h -(the)g(curren)m(t)f(output)0 204 y(\014le,)30 b(and)f(restores)i -Fn(stdout)e Fp(as)i(the)f(curren)m(t)g(output)g(\014le.)141 -317 y(If)g(this)f(function)g(fails,)h(it)f(returns)h -Fm(nil)p Fp(,)g(plus)f(a)h(string)g(describing)e(the)i(error.)141 -430 y Fo(System)e(dep)-5 b(endent:)39 b Fp(if)24 b Fn(filename)e -Fp(starts)k(with)d(a)i Fn(|)p Fp(,)h(then)e(a)h(pip)s(ed)e(output)h(is) -g(op)s(en,)h(via)g(function)e Fn(popen)p Fp(.)0 670 y -Fk(\017)35 b Fn(appendto)46 b(\(filename\))0 842 y Fp(This)34 -b(function)h(op)s(ens)g(a)h(\014le)f(named)h Fn(filename)d -Fp(and)j(sets)g(it)f(as)h(the)h Fo(curr)-5 b(ent)36 b -Fp(output)g(\014le.)56 b(It)36 b(returns)f(the)0 955 -y(\014le)30 b(handle,)g(or)h Fm(nil)g Fp(in)e(case)j(of)f(error.)42 -b(Unlik)m(e)30 b(the)h Fn(writeto)d Fp(op)s(eration,)j(this)f(function) -f(do)s(es)i(not)g(erase)h(an)m(y)0 1068 y(previous)d(con)m(ten)m(t)j -(of)f(the)f(\014le.)40 b(If)30 b(this)f(function)g(fails,)g(it)h -(returns)f Fm(nil)p Fp(,)i(plus)e(a)h(string)g(describing)e(the)i -(error.)141 1181 y(Notice)h(that)g(function)f Fn(writeto)e -Fp(is)h(a)m(v)-5 b(ailable)30 b(to)h(close)g(a)g(\014le.)0 -1421 y Fk(\017)k Fn(remove)46 b(\(filename\))0 1592 y -Fp(This)25 b(function)h(deletes)h(the)g(\014le)g(with)e(the)j(giv)m(en) -f(name.)39 b(If)27 b(this)f(function)f(fails,)i(it)g(returns)e -Fm(nil)p Fp(,)j(plus)e(a)h(string)0 1705 y(describing)h(the)j(error.)0 -1945 y Fk(\017)k Fn(rename)46 b(\(name1,)g(name2\))0 -2117 y Fp(This)41 b(function)h(renames)i(\014le)e Fn(name1)g -Fp(to)i Fn(name2)p Fp(.)78 b(If)43 b(this)f(function)g(fails,)j(it)e -(returns)f Fm(nil)p Fp(,)47 b(plus)41 b(a)j(string)0 -2230 y(describing)28 b(the)j(error.)0 2470 y Fk(\017)k -Fn(tmpname)46 b(\(\))0 2642 y Fp(This)29 b(function)g(returns)g(a)i -(string)e(with)g(a)i(\014le)e(name)i(that)g(can)f(safely)g(b)s(e)g -(used)g(for)g(a)g(temp)s(orary)g(\014le.)0 2882 y Fk(\017)35 -b Fn(read)47 b(\([readpattern]\))0 3053 y Fp(This)25 -b(function)h(reads)h(the)g(curren)m(t)g(input)e(according)i(to)g(a)h -(read)f(pattern,)h(that)f(sp)s(eci\014es)f(ho)m(w)h(m)m(uc)m(h)g(to)h -(read;)0 3166 y(c)m(haracters)36 b(are)g(read)f(from)f(the)h(curren)m -(t)g(input)e(\014le)h(un)m(til)f(the)j(read)e(pattern)i(fails)d(or)i -(ends.)54 b(The)34 b(function)0 3279 y Fn(read)28 b Fp(returns)f(a)i -(string)f(with)g(the)g(c)m(haracters)j(read,)e(or)g Fm(nil)g -Fp(if)e(the)i(read)g(pattern)g(fails)e Fo(and)39 b Fp(the)29 -b(result)f(string)0 3392 y(w)m(ould)35 b(b)s(e)g(empt)m(y)-8 -b(.)58 b(When)35 b(called)g(without)g(parameters,)j(it)d(uses)h(a)g -(default)f(pattern)h(that)g(reads)g(the)g(next)0 3505 -y(line)29 b(\(see)i(b)s(elo)m(w\).)141 3618 y(A)37 b -Fo(r)-5 b(e)g(ad)40 b(p)-5 b(attern)38 b Fp(is)e(a)h(sequence)g(of)f -(read)h(pattern)g(items.)58 b(An)37 b(item)f(ma)m(y)h(b)s(e)f(a)h -(single)e(c)m(haracter)j(class)0 3731 y(or)33 b(a)h(c)m(haracter)g -(class)f(follo)m(w)m(ed)g(b)m(y)g Fn(?)f Fp(or)i(b)m(y)e -Fn(*)p Fp(.)49 b(A)33 b(single)f(c)m(haracter)j(class)d(reads)h(the)g -(next)h(c)m(haracter)g(from)0 3844 y(the)k(input)d(if)i(it)g(b)s -(elongs)f(to)j(the)e(class,)j(otherwise)d(it)g(fails.)61 -b(A)37 b(c)m(haracter)i(class)f(follo)m(w)m(ed)f(b)m(y)g -Fn(?)g Fp(reads)h(the)0 3957 y(next)d(c)m(haracter)i(from)d(the)h -(input)e(if)h(it)h(b)s(elongs)f(to)i(the)f(class;)i(it)e(nev)m(er)g -(fails.)53 b(A)35 b(c)m(haracter)i(class)d(follo)m(w)m(ed)0 -4069 y(b)m(y)f Fn(*)f Fp(reads)g(un)m(til)f(a)i(c)m(haracter)i(that)e -(do)s(es)f(not)h(b)s(elong)f(to)i(the)f(class,)g(or)g(end)f(of)g -(\014le;)i(since)e(it)g(can)h(matc)m(h)h(a)0 4182 y(sequence)d(of)f -(zero)h(c)m(haracteres,)i(it)d(nev)m(er)h(fails.)1691 -4149 y Fl(4)141 4295 y Fp(A)e(pattern)f(item)g(ma)m(y)h(con)m(tain)g -(sub-patterns)e(enclosed)i(in)e(curly)g(brac)m(k)m(ets,)j(that)f -(describ)s(e)e Fo(skips)p Fp(.)40 b(Char-)0 4408 y(acters)31 -b(matc)m(hing)g(a)g(skip)e(are)h(read,)h(but)e(are)i(not)g(included)c -(in)j(the)g(resulting)f(string.)141 4521 y(F)-8 b(ollo)m(wing)30 -b(are)h(some)g(examples)e(of)i(read)f(patterns)h(and)e(their)h -(meanings:)136 4709 y Fk(\017)46 b Fn(".")30 b Fp(returns)f(the)h(next) -h(c)m(haracter,)h(or)f Fm(nil)f Fp(on)g(end)g(of)h(\014le.)136 -4896 y Fk(\017)46 b Fn(".*")29 b Fp(reads)i(the)f(whole)g(\014le.)p -0 4958 1560 4 v 104 5012 a Fj(4)138 5043 y Fi(Notice)24 -b(that)e(this)h(b)r(eha)n(viour)g(is)h(di\013eren)n(t)e(from)h(regular) -h(pattern)e(matc)n(hing,)h(where)h(a)f Fc(*)g Fi(expands)f(to)i(the)e -(maxim)n(um)e(length)0 5135 y Fg(such)28 b(that)35 b -Fi(the)25 b(rest)h(of)g(the)f(pattern)h(do)r(es)g(not)g(fail.)1905 -5589 y Fp(21)p eop -%%Page: 22 22 -22 21 bop 136 91 a Fk(\017)46 b Fn("[^\\n]*{\\n}")30 -b Fp(returns)i(the)h(next)g(line)f(\(skipping)e(the)k(end)e(of)h -(line\),)g(or)g Fm(nil)g Fp(on)g(end)g(of)g(\014le.)48 -b(This)31 b(is)227 204 y(the)g(default)e(pattern.)136 -392 y Fk(\017)46 b Fn("{\045s*}\045S\045S*")31 b Fp(returns)i(the)h -(next)g(w)m(ord)g(\(maximal)f(sequence)h(of)h(non)e(white-space)h(c)m -(haracters\),)j(or)227 505 y Fm(nil)31 b Fp(on)f(end)g(of)g(\014le.)136 -692 y Fk(\017)46 b Fn("{\045s*}[+-]?\045d\045d*")26 b -Fp(returns)j(the)i(next)f(in)m(teger)h(or)f Fm(nil)h -Fp(if)e(the)i(next)f(c)m(haracters)i(do)e(not)h(conform)f(to)227 -805 y(an)h(in)m(teger)f(format.)0 1045 y Fk(\017)35 b -Fn(write)47 b(\(value1,)e(...\))0 1217 y Fp(This)30 b(function)h -(writes)h(the)g(v)-5 b(alue)32 b(of)g(eac)m(h)h(of)g(its)e(argumen)m -(ts)i(to)g(the)f(curren)m(t)g(output)g(\014le.)45 b(The)32 -b(argumen)m(ts)0 1330 y(m)m(ust)e(b)s(e)f(strings)g(or)i(n)m(um)m(b)s -(ers.)39 b(If)29 b(this)g(function)g(fails,)g(it)h(returns)f -Fm(nil)p Fp(,)h(plus)e(a)j(string)e(describing)f(the)i(error.)0 -1570 y Fk(\017)35 b Fn(date)47 b(\([format]\))0 1742 -y Fp(This)35 b(function)h(returns)g(a)i(string)e(con)m(taining)h(date)h -(and)e(time)h(formatted)h(according)f(to)h(the)g(giv)m(en)f(string)0 -1855 y Fn(format)p Fp(,)f(follo)m(wing)f(the)h(same)h(rules)d(of)j(the) -f(ANSI)g(C)g(function)e Fn(strftime)p Fp(.)56 b(When)36 -b(called)g(without)f(argu-)0 1968 y(men)m(ts,)c(it)f(returns)f(a)i -(reasonable)f(date)h(and)f(time)g(represen)m(tation.)0 -2208 y Fk(\017)35 b Fn(exit)47 b(\([code]\))0 2379 y -Fp(This)29 b(function)g(calls)g(the)i(C)f(function)f -Fn(exit)p Fp(,)g(with)g(an)i(optional)e Fn(code)p Fp(,)h(to)h -(terminate)f(the)h(program.)0 2619 y Fk(\017)k Fn(getenv)46 -b(\(varname\))0 2791 y Fp(Returns)29 b(the)i(v)-5 b(alue)30 -b(of)g(the)h(en)m(vironmen)m(t)f(v)-5 b(ariable)29 b -Fn(varname)p Fp(,)g(or)h Fm(nil)h Fp(if)e(the)h(v)-5 -b(ariable)30 b(is)f(not)i(de\014ned.)0 3031 y Fk(\017)k -Fn(execute)46 b(\(command\))0 3203 y Fp(This)38 b(function)h(is)g -(equiv)-5 b(alen)m(t)39 b(to)h(the)h(C)e(function)g Fn(system)p -Fp(.)67 b(It)40 b(passes)g Fn(command)e Fp(to)i(b)s(e)g(executed)g(b)m -(y)g(an)0 3316 y(Op)s(erating)29 b(System)h(Shell.)39 -b(It)30 b(returns)f(an)i(error)f(co)s(de,)h(whic)m(h)e(is)g(implemen)m -(tation-de\014ned.)0 3602 y Fq(7)135 b(The)44 b(Debugger)i(In)l -(terface)0 3805 y Fp(Lua)31 b(has)f(no)h(built-in)d(debugger)j -(facilities.)41 b(Instead,)31 b(it)f(o\013ers)i(a)f(sp)s(ecial)f(in)m -(terface,)h(b)m(y)g(means)g(of)g(functions)0 3918 y(and)f -Fo(ho)-5 b(oks)p Fp(,)34 b(whic)m(h)29 b(allo)m(ws)i(the)g -(construction)g(of)g(di\013eren)m(t)f(kinds)f(of)j(debuggers,)f -(pro\014lers,)e(and)i(other)g(to)s(ols)0 4031 y(that)37 -b(need)e(\\inside)g(information")f(from)i(the)g(in)m(terpreter.)57 -b(This)35 b(in)m(terface)h(is)f(declared)h(in)f(the)h(header)g(\014le)0 -4144 y Fn(luadebug.h)p Fp(.)0 4387 y Ff(7.1)112 b(Stac)m(k)38 -b(and)g(F)-9 b(unction)37 b(Information)0 4559 y Fp(The)30 -b(main)f(function)g(to)i(get)h(information)d(ab)s(out)h(the)g(in)m -(terpreter)g(stac)m(k)i(is)0 4746 y Fn(lua_Function)44 -b(lua_stackedfunction)f(\(int)k(level\);)0 4934 y Fp(It)35 -b(returns)e(a)i(handle)e(\()p Fn(lua_Function)p Fp(\))f(to)k(the)e -Fo(activation)k(r)-5 b(e)g(c)g(or)g(d)47 b Fp(of)35 b(the)f(function)g -(executing)h(at)g(a)g(giv)m(en)0 5047 y(lev)m(el.)68 -b(Lev)m(el)40 b(0)g(is)f(the)h(curren)m(t)g(running)d(function,)k -(while)c(lev)m(el)j Fe(n)26 b Fp(+)g(1)40 b(is)f(the)h(function)e(that) -i(has)g(called)0 5160 y(lev)m(el)g Fe(n)p Fp(.)69 b(When)39 -b(called)h(with)e(a)j(lev)m(el)e(greater)i(than)f(the)g(stac)m(k)i -(depth,)f Fn(lua_stackedfunction)35 b Fp(returns)0 5273 -y Fn(LUA_NOOBJECT)p Fp(.)1905 5589 y(22)p eop -%%Page: 23 23 -23 22 bop 141 91 a Fp(The)43 b(t)m(yp)s(e)g Fn(lua_Function)c -Fp(is)j(just)g(another)h(name)g(to)h Fn(lua_Object)p -Fp(.)75 b(Although,)46 b(in)41 b(this)h(library)-8 b(,)45 -b(a)0 204 y Fn(lua_Function)23 b Fp(can)k(b)s(e)f(used)g(wherev)m(er)h -(a)g Fn(lua_Object)d Fp(is)h(required,)h(a)h(parameter)g -Fn(lua_Function)d Fp(accepts)0 317 y(only)29 b(a)i(handle)e(returned)g -(b)m(y)i Fn(lua_stackedfunction)p Fp(.)141 430 y(Three)f(other)h -(functions)e(pro)s(duce)g(extra)i(information)e(ab)s(out)h(a)g -(function:)0 593 y Fn(void)47 b(lua_funcinfo)d(\(lua_Object)h(func,)h -(char)h(**filename,)e(int)h(*linedefined\);)0 706 y(int)h -(lua_currentline)d(\(lua_Function)g(func\);)0 819 y(char)j -(*lua_getobjname)c(\(lua_Object)i(o,)i(char)g(**name\);)0 -982 y(lua_funcinfo)31 b Fp(giv)m(es)j(the)h(\014le)e(name)h(and)g(the)g -(line)f(where)g(the)i(giv)m(en)f(function)f(has)h(b)s(een)f(de\014ned.) -51 b(If)34 b(the)0 1095 y(\\function")40 b(is)f(in)g(fact)j(the)e(main) -f(co)s(de)i(of)f(a)h(c)m(h)m(unk,)i(then)d Fn(linedefined)d -Fp(is)j(0.)71 b(If)40 b(the)g(function)f(is)h(a)g(C)0 -1208 y(function,)29 b(then)h Fn(linedefined)e Fp(is)h(-1,)i(and)f -Fn(filename)e Fp(is)i Fn("\(C\)")p Fp(.)141 1320 y(The)35 -b(function)e Fn(lua_currentline)e Fp(giv)m(es)k(the)h(curren)m(t)e -(line)g(where)g(a)h(giv)m(en)g(function)f(is)g(executing.)55 -b(It)0 1433 y(only)30 b(w)m(orks)h(if)f(the)h(function)f(has)g(b)s(een) -g(pre-compiled)g(with)f(debug)h(information)g(\(see)i(Section)e(4.8\).) -44 b(When)0 1546 y(no)30 b(line)f(information)g(is)g(a)m(v)-5 -b(ailable,)30 b(it)g(returns)f(-1.)141 1659 y(F)-8 b(unction)32 -b Fn(lua_getobjname)d Fp(tries)j(to)h(\014nd)d(a)j(reasonable)f(name)h -(for)f(a)h(giv)m(en)f(function.)46 b(Because)34 b(func-)0 -1772 y(tions)22 b(in)f(Lua)h(are)g(\014rst)g(class)g(v)-5 -b(alues,)23 b(they)g(do)f(not)g(ha)m(v)m(e)i(a)e(\014xed)g(name.)38 -b(Some)22 b(functions)f(ma)m(y)i(b)s(e)f(the)g(v)-5 b(alue)22 -b(of)0 1885 y(man)m(y)30 b(global)e(v)-5 b(ariables,)29 -b(while)e(others)j(ma)m(y)g(b)s(e)f(stored)h(only)e(in)g(a)i(table)g -(\014eld.)39 b(F)-8 b(unction)29 b Fn(lua_getobjname)0 -1998 y Fp(\014rst)k(c)m(hec)m(ks)j(whether)d(the)h(giv)m(en)g(function) -f(is)g(a)i(fallbac)m(k.)51 b(If)33 b(so,)j(it)d(returns)g(the)h(string) -f Fn("fallback")p Fp(,)g(and)0 2111 y Fn(name)e Fp(is)f(set)i(to)h(p)s -(oin)m(t)e(to)h(the)g(fallbac)m(k)f(name.)45 b(Otherwise,)31 -b(if)f(the)i(giv)m(en)g(function)e(is)h(the)h(v)-5 b(alue)31 -b(of)h(a)g(global)0 2224 y(v)-5 b(ariable,)22 b(then)f -Fn(lua_getobjname)c Fp(returns)j(the)h(string)f Fn("global")p -Fp(,)h(while)f Fn(name)g Fp(p)s(oin)m(ts)g(to)h(the)h(v)-5 -b(ariable)20 b(name.)0 2337 y(If)32 b(the)g(giv)m(en)h(function)e(is)g -(neither)g(a)i(fallbac)m(k)f(nor)g(a)h(global)e(v)-5 -b(ariable,)32 b(then)g Fn(lua_getobjname)d Fp(returns)i(the)0 -2450 y(empt)m(y)g(string,)e(and)h Fn(name)f Fp(is)h(set)h(to)g -Fn(NULL)p Fp(.)0 2688 y Ff(7.2)112 b(Manipulating)37 -b(Lo)s(cal)g(V)-9 b(ariables)0 2860 y Fp(The)32 b(follo)m(wing)f -(functions)f(allo)m(w)i(the)h(manipulation)c(of)k(the)f(lo)s(cal)g(v)-5 -b(ariables)31 b(of)h(a)h(giv)m(en)f(activ)-5 b(ation)33 -b(record.)0 2973 y(They)d(only)f(w)m(ork)i(if)e(the)i(function)e(has)h -(b)s(een)g(pre-compiled)e(with)h(debug)h(information)f(\(see)i(Section) -f(4.8\).)0 3136 y Fn(lua_Object)45 b(lua_getlocal)f(\(lua_Function)h -(func,)h(int)h(local_number,)d(char)j(**name\);)0 3249 -y(int)g(lua_setlocal)d(\(lua_Function)h(func,)h(int)h(local_number\);)0 -3412 y Fp(The)37 b(\014rst)f(one)h(returns)f(the)h(v)-5 -b(alue)37 b(of)g(a)h(lo)s(cal)e(v)-5 b(ariable,)38 b(and)e(sets)i -Fn(name)e Fp(to)i(p)s(oin)m(t)e(to)h(the)h(v)-5 b(ariable)36 -b(name.)0 3525 y Fn(local_number)e Fp(is)i(an)h(index)f(for)h(lo)s(cal) -f(v)-5 b(ariables.)60 b(The)37 b(\014rst)g(parameter)g(has)g(index)f -(1,)k(and)c(so)i(on,)h(un)m(til)0 3638 y(the)45 b(last)f(activ)m(e)i -(lo)s(cal)e(v)-5 b(ariable.)82 b(When)44 b(called)g(with)f(a)i -Fn(local_number)d Fp(greater)j(than)g(the)g(n)m(um)m(b)s(er)e(of)0 -3750 y(activ)m(e)32 b(lo)s(cal)f(v)-5 b(ariables,)30 -b(or)h(if)e(the)j(activ)-5 b(ation)31 b(record)g(has)g(no)g(debug)f -(information,)g Fn(lua_getlocal)d Fp(returns)0 3863 y -Fn(LUA_NOOBJECT)p Fp(.)141 3976 y(The)22 b(function)f -Fn(lua_setlocal)e Fp(sets)k(the)f(lo)s(cal)g(v)-5 b(ariable)21 -b Fn(local_number)e Fp(to)k(the)g(v)-5 b(alue)22 b(previously)e(pushed) -0 4089 y(on)j(the)g(stac)m(k)i(\(see)f(Section)e(5.2\).)40 -b(If)23 b(the)g(function)f(succeeds,)j(then)d(it)h(returns)f(1.)38 -b(If)23 b Fn(local_number)d Fp(is)i(greater)0 4202 y(than)j(the)g(n)m -(um)m(b)s(er)e(of)j(activ)m(e)g(lo)s(cal)e(v)-5 b(ariables,)25 -b(or)g(if)f(the)h(activ)-5 b(ation)25 b(record)g(has)g(no)f(debug)h -(information,)f(then)0 4315 y(this)29 b(function)g(fails)g(and)h -(returns)f(0.)0 4554 y Ff(7.3)112 b(Ho)s(oks)0 4725 y -Fp(The)30 b(Lua)g(in)m(terpreter)g(o\013ers)g(t)m(w)m(o)i(ho)s(oks)e -(for)g(debugging)g(purp)s(oses:)0 4888 y Fn(typedef)46 -b(void)g(\(*lua_CHFunction\))e(\(lua_Function)g(func,)i(char)h(*file,)f -(int)h(line\);)0 5001 y(extern)f(lua_CHFunction)e(lua_callhook;)0 -5227 y(typedef)i(void)g(\(*lua_LHFunction\))e(\(int)i(line\);)0 -5340 y(extern)g(lua_LHFunction)e(lua_linehook;)1905 5589 -y Fp(23)p eop -%%Page: 24 24 -24 23 bop 0 91 a Fp(The)44 b(\014rst)f(one)i(is)e(called)g(whenev)m(er) -h(the)g(in)m(terpreter)g(en)m(ters)h(or)f(lea)m(v)m(es)h(a)g(function.) -81 b(When)43 b(en)m(tering)i(a)0 204 y(function,)35 b(its)g(parameters) -h(are)g(a)f(handle)f(to)i(the)g(function)e(activ)-5 b(ation)35 -b(record,)i(plus)c(the)j(\014le)e(and)h(the)h(line)0 -317 y(where)g(the)h(function)e(is)h(de\014ned)g(\(the)h(same)g -(information)e(whic)m(h)g(is)h(pro)m(vided)f(b)m(y)i -Fn(lua_funcinfo)p Fp(\);)g(when)0 430 y(lea)m(ving)30 -b(a)h(function,)e Fn(func)g Fp(is)h Fn(LUA_NOOBJECT)p -Fp(,)d Fn(file)i Fp(is)h Fn("\(return\)")p Fp(,)e(and)h -Fn(line)g Fp(is)h(0.)141 543 y(The)46 b(other)h(ho)s(ok)g(is)f(called)f -(ev)m(ery)j(time)e(the)h(in)m(terpreter)f(c)m(hanges)i(the)f(line)e(of) -i(co)s(de)g(it)f(is)g(execut-)0 656 y(ing.)63 b(Its)38 -b(only)f(parameter)h(is)f(the)h(line)f(n)m(um)m(b)s(er)f(\(the)j(same)f -(information)e(whic)m(h)h(is)g(pro)m(vided)g(b)m(y)g(the)i(call)0 -769 y Fn(lua_currentline\(lua_stac)o(kedf)o(unct)o(ion)o(\(0\)\))o -Fp(\).)34 b(This)25 b(second)h(ho)s(ok)h(is)e(only)h(called)g(if)f(the) -i(activ)m(e)h(func-)0 882 y(tion)i(has)g(b)s(een)g(pre-compiled)e(with) -h(debug)h(information)f(\(see)i(Section)f(4.8\).)141 -995 y(A)h(ho)s(ok)f(is)f(disabled)f(when)i(its)f(v)-5 -b(alue)30 b(is)g(NULL)g(\(0\),)i(whic)m(h)d(is)g(the)i(initial)c(v)-5 -b(alue)30 b(of)h(b)s(oth)e(ho)s(oks.)0 1281 y Fq(8)135 -b(Some)45 b(Examples)0 1484 y Fp(This)32 b(section)i(giv)m(es)g -(examples)f(sho)m(wing)g(some)h(features)g(of)g(Lua.)51 -b(It)34 b(do)s(es)f(not)h(in)m(tend)f(to)h(co)m(v)m(er)i(the)e(whole)0 -1597 y(language,)d(but)f(only)f(to)i(illustrate)e(some)i(in)m -(teresting)e(uses)h(of)h(the)f(system.)0 1840 y Ff(8.1)112 -b(Data)38 b(Structures)0 2012 y Fp(T)-8 b(ables)28 b(are)i(a)f(strong)g -(unifying)d(data)k(constructor.)40 b(They)29 b(directly)e(implemen)m(t) -h(a)h(m)m(ultitude)e(of)i(data)h(t)m(yp)s(es,)0 2125 -y(lik)m(e)g(ordinary)e(arra)m(ys,)j(records,)g(sets,)g(bags,)g(and)e -(lists.)141 2238 y(Arra)m(ys)40 b(need)g(no)h(explanations.)69 -b(In)39 b(Lua,)k(it)d(is)f(con)m(v)m(en)m(tional)i(to)g(start)g -(indices)d(from)i(1,)j(but)d(this)f(is)0 2351 y(only)28 -b(a)i(con)m(v)m(en)m(tion.)41 b(Arra)m(ys)29 b(can)h(b)s(e)e(indexed)g -(b)m(y)h(0,)h(negativ)m(e)g(n)m(um)m(b)s(ers,)e(or)h(an)m(y)h(other)f -(v)-5 b(alue)29 b(\(except)h Fm(nil)p Fp(\).)0 2464 y(Records)g(are)h -(also)g(trivially)c(implemen)m(ted)i(b)m(y)h(the)h(syn)m(tactic)g -(sugar)f Fn(a.x)p Fp(.)141 2576 y(The)j(b)s(est)g(w)m(a)m(y)i(to)f -(implemen)m(t)e(a)i(set)g(is)e(to)j(store)f(its)f(elemen)m(ts)g(as)h -(indices)e(of)h(a)h(table.)50 b(The)33 b(statemen)m(t)0 -2689 y Fn(s)47 b(=)h({})29 b Fp(creates)i(an)e(empt)m(y)h(set)g -Fn(s)p Fp(.)40 b(The)29 b(statemen)m(t)i Fn(s[x])47 b(=)g(1)29 -b Fp(inserts)f(the)i(v)-5 b(alue)29 b(of)g Fn(x)g Fp(in)m(to)h(the)f -(set)h Fn(s)p Fp(.)40 b(The)0 2802 y(expression)28 b -Fn(s[x])g Fp(is)g(true)g(if)g(and)h(only)f(if)g Fn(x)g -Fp(b)s(elongs)g(to)i Fn(s)p Fp(.)40 b(Finally)-8 b(,)28 -b(the)h(statemen)m(t)i Fn(s[x])46 b(=)i(nil)28 b Fp(remo)m(v)m(es)i -Fn(x)0 2915 y Fp(from)g Fn(s)p Fp(.)141 3028 y(Bags)i(can)g(b)s(e)e -(implemen)m(ted)g(similarly)e(to)k(sets,)g(but)e(using)g(the)h(v)-5 -b(alue)31 b(asso)s(ciated)h(to)f(an)g(elemen)m(t)h(as)g(its)0 -3141 y(coun)m(ter.)41 b(So,)31 b(to)g(insert)e(an)i(elemen)m(t,)g(the)f -(follo)m(wing)f(co)s(de)i(is)e(enough:)0 3329 y Fn(if)47 -b(s[x])g(then)f(s[x])h(=)h(s[x]+1)e(else)g(s[x])h(=)g(1)h(end)0 -3516 y Fp(and)30 b(to)h(remo)m(v)m(e)h(an)e(elemen)m(t:)0 -3704 y Fn(if)47 b(s[x])g(then)f(s[x])h(=)h(s[x]-1)e(end)0 -3817 y(if)h(s[x])g(==)g(0)g(then)g(s[x])g(=)g(nil)g(end)141 -4004 y Fp(Lisp-lik)m(e)41 b(lists)g(also)h(ha)m(v)m(e)i(an)e(easy)i -(implemen)m(tation.)75 b(The)42 b(\\cons")i(of)f(t)m(w)m(o)g(elemen)m -(ts)g Fn(x)g Fp(and)e Fn(y)i Fp(can)0 4117 y(b)s(e)32 -b(created)i(with)e(the)h(co)s(de)g Fn(l)48 b(=)f({car=x,)f(cdr=y})p -Fp(.)h(The)32 b(expression)g Fn(l.car)g Fp(extracts)i(the)f(header,)h -(while)0 4230 y Fn(l.cdr)27 b Fp(extracts)j(the)f(tail.)39 -b(An)28 b(alternativ)m(e)h(w)m(a)m(y)h(is)e(to)h(create)h(the)f(list)e -(directly)g(with)h Fn(l={x,y})p Fp(,)f(and)h(then)g(to)0 -4343 y(extract)k(the)e(header)h(with)e Fn(l[1])g Fp(and)h(the)g(tail)g -(with)f Fn(l[2])p Fp(.)0 4587 y Ff(8.2)112 b(The)38 b(F)-9 -b(unctions)37 b Fb(next)h Ff(and)h Fb(nextvar)0 4758 -y Fp(This)34 b(example)i(sho)m(ws)g(ho)m(w)g(to)h(use)f(the)g(function) -f Fn(next)g Fp(to)i(iterate)f(o)m(v)m(er)i(the)e(\014elds)f(of)h(a)g -(table.)58 b(F)-8 b(unction)0 4871 y Fn(clone)29 b Fp(receiv)m(es)i(an) -m(y)g(table)f(and)g(returns)f(a)i(clone)f(of)h(it.)0 -5059 y Fn(function)46 b(clone)g(\(t\))524 b(--)47 b(t)h(is)f(a)g(table) -95 5172 y(local)g(new_t)f(=)i({})524 b(--)47 b(create)f(a)i(new)f -(table)95 5285 y(local)g(i,)g(v)g(=)h(next\(t,)e(nil\))94 -b(--)47 b(i)h(is)f(an)g(index)f(of)i(t,)f(v)g(=)h(t[i])1905 -5589 y Fp(24)p eop -%%Page: 25 25 -25 24 bop 95 91 a Fn(while)47 b(i)g(do)191 204 y(new_t[i])e(=)j(v)191 -317 y(i,)f(v)h(=)f(next\(t,)f(i\))381 b(--)47 b(get)g(next)g(index)95 -430 y(end)95 543 y(return)g(new_t)0 656 y(end)141 825 -y Fp(The)30 b(next)h(example)f(prin)m(ts)e(the)j(names)f(of)h(all)e -(global)h(v)-5 b(ariables)29 b(in)g(the)h(system)h(with)e(non)h(nil)e -(v)-5 b(alues:)0 995 y Fn(function)46 b(printGlobalVariables)c(\(\))95 -1108 y(local)47 b(i,)g(v)g(=)h(nextvar\(nil\))95 1221 -y(while)f(i)g(do)191 1334 y(print\(i\))191 1447 y(i,)g(v)h(=)f -(nextvar\(i\))95 1560 y(end)0 1672 y(end)0 1913 y Ff(8.3)112 -b(String)37 b(Manipulation)0 2084 y Fp(The)30 b(\014rst)f(example)i(is) -e(a)i(function)e(to)i(trim)e(extra)i(white-spaces)g(at)g(the)f(b)s -(eginning)e(and)i(end)f(of)i(a)g(string.)0 2254 y Fn(function)46 -b(trim\(s\))95 2367 y(local)h(_,)g(i)g(=)h(strfind\(s,)d('^)i(*'\))95 -2480 y(local)g(f,)g(__)g(=)h(strfind\(s,)d(')i(*$'\))95 -2592 y(return)g(strsub\(s,)e(i+1,)h(f-1\))0 2705 y(end)141 -2875 y Fp(The)30 b(second)g(example)h(sho)m(ws)f(a)g(function)f(that)i -(eliminates)e(all)g(spaces)i(of)g(a)g(string.)0 3044 -y Fn(function)46 b(remove_blanks)e(\(s\))95 3157 y(return)j(gsub\(s,)e -("\045s\045s*",)h(""\))0 3270 y(end)0 3510 y Ff(8.4)112 -b(V)-9 b(ariable)36 b(n)m(um)m(b)s(er)i(of)f(argumen)m(ts)0 -3682 y Fp(Lua)24 b(do)s(es)g(not)g(pro)m(vide)f(an)m(y)i(explicit)d -(mec)m(hanism)i(to)g(deal)g(with)f(v)-5 b(ariable)23 -b(n)m(um)m(b)s(er)g(of)h(argumen)m(ts)g(in)f(function)0 -3795 y(calls.)38 b(Ho)m(w)m(ev)m(er,)28 b(one)d(can)g(use)f(table)h -(constructors)g(to)g(sim)m(ulate)f(this)f(mec)m(hanism.)39 -b(As)24 b(an)h(example,)g(supp)s(ose)0 3908 y(a)31 b(function)e(to)i -(concatenate)i(all)c(its)h(argumen)m(ts.)41 b(It)30 b(could)g(b)s(e)g -(written)f(lik)m(e)0 4077 y Fn(function)46 b(concat)g(\(o\))95 -4190 y(local)h(i)g(=)h(1)95 4303 y(local)f(s)g(=)h('')95 -4416 y(while)f(o[i])f(do)191 4529 y(s)h(=)h(s)f(..)g(o[i])191 -4642 y(i)g(=)h(i+1)95 4755 y(end)95 4868 y(return)f(s)0 -4981 y(end)0 5150 y Fp(T)-8 b(o)31 b(call)f(it,)g(one)g(uses)g(a)h -(table)f(constructor)h(to)g(join)f(all)f(argumen)m(ts:)95 -5320 y Fn(x)48 b(=)f(concat{"hello)e(",)i("john",)f(")h(and)g(",)g -("mary"})1905 5589 y Fp(25)p eop -%%Page: 26 26 -26 25 bop 0 91 a Ff(8.5)112 b(P)m(ersistence)0 263 y -Fp(Because)41 b(of)e(its)g(re\015exiv)m(e)g(facilities,)h(p)s -(ersistence)e(in)g(Lua)h(can)g(b)s(e)g(ac)m(hiev)m(ed)h(within)d(the)i -(language.)68 b(This)0 376 y(section)24 b(sho)m(ws)g(some)g(w)m(a)m(ys) -g(to)h(store)f(and)g(retriev)m(e)g(v)-5 b(alues)23 b(in)g(Lua,)i(using) -d(a)i(text)h(\014le)e(written)g(in)f(the)j(language)0 -489 y(itself)k(as)i(the)f(storage)i(media.)141 602 y(T)-8 -b(o)31 b(store)g(a)g(single)e(v)-5 b(alue)30 b(with)f(a)h(name,)h(the)g -(follo)m(wing)e(co)s(de)h(is)g(enough:)0 770 y Fn(function)46 -b(store)g(\(name,)g(value\))95 883 y(write\(format\('\\n\045s)d(=',)k -(name\)\))95 996 y(write_value\(value\))0 1109 y(end)0 -1298 y(function)f(write_value)e(\(value\))95 1411 y(local)j(t)g(=)h -(type\(value\))286 1524 y(if)g(t)f(==)g('nil')190 b(then)46 -b(write\('nil'\))95 1637 y(elseif)h(t)g(==)g('number')f(then)g -(write\(value\))95 1750 y(elseif)h(t)g(==)g('string')f(then)g -(write\(value,)f('q'\))95 1863 y(end)0 1976 y(end)0 2165 -y Fp(In)30 b(order)g(to)h(restore)g(this)e(v)-5 b(alue,)30 -b(a)h Fn(lua_dofile)c Fp(su\016ces.)141 2278 y(Storing)k(tables)h(is)f -(a)i(little)e(more)h(complex.)45 b(Assuming)31 b(that)h(the)h(table)f -(is)f(a)h(tree,)i(and)d(that)i(all)e(indices)0 2391 y(are)f(iden)m -(ti\014ers)e(\(that)j(is,)f(the)g(tables)f(are)i(b)s(eing)d(used)i(as)g -(records\),)g(then)g(its)f(v)-5 b(alue)30 b(can)g(b)s(e)f(written)g -(directly)0 2504 y(with)g(table)h(constructors.)41 b(First,)30 -b(the)h(function)e Fn(write_value)e Fp(is)j(c)m(hanged)h(to)0 -2672 y Fn(function)46 b(write_value)e(\(value\))95 2785 -y(local)j(t)g(=)h(type\(value\))286 2898 y(if)g(t)f(==)g('nil')190 -b(then)46 b(write\('nil'\))95 3011 y(elseif)h(t)g(==)g('number')f(then) -g(write\(value\))95 3124 y(elseif)h(t)g(==)g('string')f(then)g -(write\(value,)f('q'\))95 3237 y(elseif)i(t)g(==)g('table')94 -b(then)46 b(write_record\(value\))95 3350 y(end)0 3463 -y(end)0 3631 y Fp(The)30 b(function)f Fn(write_record)e -Fp(is:)0 3799 y Fn(function)46 b(write_record\(t\))95 -3912 y(local)h(i,)g(v)g(=)h(next\(t,)e(nil\))95 4025 -y(write\('{'\))93 b(--)47 b(starts)f(constructor)95 4138 -y(while)h(i)g(do)191 4251 y(store\(i,)e(v\))191 4364 -y(write\(',)g('\))191 4477 y(i,)i(v)h(=)f(next\(t,)f(i\))95 -4590 y(end)95 4703 y(write\('}'\))93 b(--)47 b(closes)f(constructor)0 -4816 y(end)0 5055 y Ff(8.6)112 b(Inheritance)0 5227 y -Fp(The)29 b(fallbac)m(k)f(for)h(absen)m(t)h(indices)e(can)h(b)s(e)g -(used)f(to)i(implemen)m(t)e(man)m(y)h(kinds)f(of)h(inheritance)f(in)g -(Lua.)40 b(As)29 b(an)0 5340 y(example,)h(the)h(follo)m(wing)e(co)s(de) -h(implemen)m(ts)f(single)g(inheritance:)1905 5589 y(26)p -eop -%%Page: 27 27 -27 26 bop 0 91 a Fn(function)46 b(Index)g(\(t,f\))95 -204 y(if)i(f)f(==)g('parent')f(then)94 b(--)47 b(to)h(avoid)e(loop)191 -317 y(return)g(OldIndex\(t,f\))95 430 y(end)95 543 y(local)h(p)g(=)h -(t.parent)95 656 y(if)g(type\(p\))d(==)j('table')d(then)191 -769 y(return)h(p[f])95 882 y(else)191 995 y(return)g(OldIndex\(t,f\))95 -1108 y(end)0 1220 y(end)0 1446 y(OldIndex)g(=)h(setfallback\("index",) -42 b(Index\))0 1634 y Fp(Whenev)m(er)30 b(Lua)e(attempts)i(to)f(access) -i(an)d(absen)m(t)i(\014eld)d(in)h(a)h(table,)g(it)g(calls)f(the)h -(fallbac)m(k)f(function)g Fn(Index)p Fp(.)38 b(If)0 1747 -y(the)27 b(table)f(has)g(a)h(\014eld)e Fn(parent)f Fp(with)h(a)i(table) -f(v)-5 b(alue,)27 b(then)f(Lua)g(attempts)i(to)f(access)h(the)e -(desired)f(\014eld)g(in)g(this)0 1860 y(paren)m(t)30 -b(ob)5 b(ject.)41 b(This)28 b(pro)s(cess)h(is)g(rep)s(eated)h(\\up)m(w) -m(ards")g(un)m(til)d(a)k(v)-5 b(alue)29 b(for)g(the)h(\014eld)e(is)h -(found)f(or)i(the)g(ob)5 b(ject)0 1973 y(has)30 b(no)g(paren)m(t.)41 -b(In)30 b(the)h(latter)f(case,)i(the)f(previous)d(fallbac)m(k)i(is)g -(called)f(to)i(supply)d(a)j(v)-5 b(alue)30 b(for)g(the)h(\014eld.)141 -2086 y(When)c(b)s(etter)h(p)s(erformance)f(is)f(needed,)i(the)g(same)g -(fallbac)m(k)f(ma)m(y)h(b)s(e)f(implemen)m(ted)f(in)g(C,)h(as)h -(illustrated)0 2198 y(in)h(Figure)h(1.)41 b(This)29 b(co)s(de)h(m)m -(ust)g(b)s(e)g(registered)g(with:)95 2386 y Fn -(lua_pushstring\("parent"\);)95 2499 y(lockedParentName)44 -b(=)j(lua_ref\(1\);)95 2612 y(lua_pushobject\(lua_setfall)o(back)o -(\("i)o(ndex)o(",)42 b(Index\)\);)95 2725 y(lockedOldIndex)i(=)k -(lua_ref\(1\);)0 2912 y Fp(Notice)31 b(ho)m(w)g(the)f(string)g -Fn("parent")e Fp(is)h(k)m(ept)i(lo)s(c)m(k)m(ed)g(in)e(Lua)h(for)g -(optimal)g(p)s(erformance.)0 3156 y Ff(8.7)112 b(Programming)36 -b(with)g(Classes)0 3327 y Fp(There)f(are)h(man)m(y)f(di\013eren)m(t)g -(w)m(a)m(ys)i(to)f(do)f(ob)5 b(ject-orien)m(ted)37 b(programming)d(in)g -(Lua.)56 b(This)33 b(section)j(presen)m(ts)0 3440 y(one)e(p)s(ossible)e -(w)m(a)m(y)j(to)g(implemen)m(t)e(classes,)j(using)c(the)j(inheritance)d -(mec)m(hanism)i(presen)m(ted)g(ab)s(o)m(v)m(e.)53 b Fo(Ple)-5 -b(ase)0 3553 y(notic)g(e:)42 b(the)32 b(fol)5 b(lowing)33 -b(examples)g(only)g(work)f(with)h(the)f(index)g(fal)5 -b(lb)-5 b(ack)33 b(r)-5 b(e)g(de\014ne)g(d)33 b(ac)-5 -b(c)g(or)g(ding)34 b(to)f(Se)-5 b(ction)32 b(8.6)p Fp(.)141 -3666 y(As)d(one)g(could)e(exp)s(ect,)j(a)f(go)s(o)s(d)f(w)m(a)m(y)i(to) -f(represen)m(t)g(a)g(class)f(is)g(with)f(a)i(table.)40 -b(This)27 b(table)h(will)e(con)m(tain)j(all)0 3779 y(instance)h(metho)s -(ds)g(of)g(the)h(class,)f(plus)f(optional)h(default)f(v)-5 -b(alues)30 b(for)g(instance)g(v)-5 b(ariables.)40 b(An)30 -b(instance)g(of)h(a)0 3892 y(class)f(has)g(its)g Fn(parent)f -Fp(\014eld)g(p)s(oin)m(ting)f(to)j(the)g(class,)f(and)g(so)h(it)f -(\\inherits")f(all)g(metho)s(ds.)141 4005 y(F)-8 b(or)28 -b(instance,)f(a)g(class)g Fn(Point)e Fp(can)i(b)s(e)f(describ)s(ed)f -(as)i(in)f(Figure)g(2.)40 b(F)-8 b(unction)26 b Fn(create)f -Fp(helps)h(the)h(creation)0 4118 y(of)e(new)f(p)s(oin)m(ts,)h(adding)e -(the)i(paren)m(t)g(\014eld.)37 b(F)-8 b(unction)24 b -Fn(move)g Fp(is)g(an)g(example)g(of)h(an)g(instance)f(metho)s(d.)38 -b(Finally)-8 b(,)0 4231 y(a)38 b(sub)s(class)d(can)j(b)s(e)e(created)i -(as)g(a)g(new)e(table,)j(with)d(the)i Fn(parent)d Fp(\014eld)h(p)s(oin) -m(ting)f(to)j(its)f(sup)s(erclass.)60 b(It)37 b(is)0 -4344 y(in)m(teresting)c(to)h(notice)f(ho)m(w)g(the)h(use)f(of)g -Fn(self)f Fp(in)g(metho)s(d)h Fn(create)e Fp(allo)m(ws)i(this)f(metho)s -(d)h(to)h(w)m(ork)f(prop)s(erly)0 4457 y(ev)m(en)e(when)e(inherited)f -(b)m(y)i(a)h(sub)s(class.)39 b(As)30 b(usual,)f(a)i(sub)s(class)d(ma)m -(y)j(o)m(v)m(erwrite)g(an)m(y)g(inherited)d(metho)s(d)h(with)0 -4569 y(its)h(o)m(wn)g(v)m(ersion.)0 4813 y Ff(8.8)112 -b(Mo)s(dules)0 4985 y Fp(Here)33 b(w)m(e)f(explain)f(one)i(p)s(ossible) -c(w)m(a)m(y)34 b(to)f(sim)m(ulate)e(mo)s(dules)f(in)h(Lua.)46 -b(The)32 b(main)f(idea)h(is)f(to)i(use)f(a)h(table)f(to)0 -5097 y(store)f(the)g(mo)s(dule)d(functions.)141 5210 -y(A)j(mo)s(dule)d(should)h(b)s(e)g(written)h(as)h(a)f(separate)i(c)m(h) -m(unk,)e(starting)g(with:)1905 5589 y(27)p eop -%%Page: 28 28 -28 27 bop 0 301 3900 12 v 0 489 a Fn(#include)46 b("lua.h")0 -715 y(int)h(lockedParentName;)91 b(/*)47 b(lock)g(index)f(for)h(the)g -(string)f("parent")f(*/)0 828 y(int)i(lockedOldIndex;)187 -b(/*)47 b(previous)e(fallback)h(function)g(*/)0 1054 -y(void)h(callOldFallback)c(\(lua_Object)i(table,)h(lua_Object)f -(index\))0 1167 y({)95 1279 y(lua_Object)g(oldIndex)h(=)h -(lua_getref\(lockedOldIndex\))o(;)95 1392 y(lua_pushobject\(table\);)95 -1505 y(lua_pushobject\(index\);)95 1618 y(lua_callfunction\(oldIndex\)) -o(;)95 1731 y(if)h(\(lua_getresult\(1\))43 b(!=)k(LUA_NOOBJECT\))191 -1844 y(lua_pushobject\(lua_getre)o(sult)o(\(1\))o(\);)89 -b(/*)48 b(return)e(result)g(*/)0 1957 y(})0 2183 y(void)h(Index)f -(\(void\))0 2296 y({)95 2409 y(lua_Object)f(table)i(=)g -(lua_getparam\(1\);)95 2521 y(lua_Object)e(index)i(=)g -(lua_getparam\(2\);)95 2634 y(lua_Object)e(parent;)95 -2747 y(if)j(\(lua_isstring\(index\))42 b(&&)47 b -(strcmp\(lua_getstring\(inde)o(x\),)41 b("parent"\))k(==)j(0\))95 -2860 y({)191 2973 y(callOldFallback\(table,)42 b(index\);)191 -3086 y(return;)95 3199 y(})95 3312 y(lua_pushobject\(table\);)95 -3425 y(lua_pushref\(lockedParentNa)o(me\);)95 3538 y(parent)47 -b(=)g(lua_getsubscript\(\);)95 3651 y(if)h(\(lua_istable\(parent\)\))95 -3763 y({)191 3876 y(lua_pushobject\(parent\);)191 3989 -y(lua_pushobject\(index\);)191 4102 y(/*)f(return)f(result)g(from)h -(getsubscript)d(*/)191 4215 y(lua_pushobject\(lua_getsu)o(bscr)o(ipt)o -(\(\)\);)95 4328 y(})95 4441 y(else)191 4554 y(callOldFallback\(table,) -e(index\);)0 4667 y(})1414 4937 y Fp(Figure)30 b(1:)41 -b(Inheritance)29 b(in)g(C.)p 0 5050 V 1905 5589 a(28)p -eop -%%Page: 29 29 -29 28 bop 0 1092 3900 12 v 0 1279 a Fn(Point)46 b(=)i({x)f(=)g(0,)h(y)f -(=)h(0})0 1505 y(function)e(Point:create)e(\(o\))95 1618 -y(o.parent)i(=)h(self)95 1731 y(return)g(o)0 1844 y(end)0 -2070 y(function)f(Point:move)f(\(p\))95 2183 y(self.x)i(=)g(self.x)f(+) -i(p.x)95 2296 y(self.y)f(=)g(self.y)f(+)i(p.y)0 2409 -y(end)0 2634 y(...)0 2860 y(--)0 2973 y(--)f(creating)f(points)0 -3086 y(--)0 3199 y(p1)h(=)h(Point:create{x)c(=)j(10,)g(y)g(=)h(20})0 -3312 y(p2)f(=)h(Point:create{x)c(=)j(10})95 b(--)47 b(y)g(will)g(be)g -(inherited)e(until)i(it)g(is)g(set)0 3538 y(--)0 3651 -y(--)g(example)f(of)h(a)h(method)e(invocation)0 3763 -y(--)0 3876 y(p1:move\(p2\))1451 4147 y Fp(Figure)30 -b(2:)41 b(A)30 b(Class)f Fn(Point)p Fp(.)p 0 4260 V 1905 -5589 a(29)p eop -%%Page: 30 30 -30 29 bop 0 12 3900 12 v 0 199 a Fn(function)46 b(open)g(\(mod\))95 -312 y(local)h(n,)g(f)g(=)h(next\(mod,)d(nil\))95 425 -y(while)i(n)g(do)191 538 y(setglobal\(n,)d(f\))191 651 -y(n,)j(f)h(=)f(next\(mod,)e(n\))95 764 y(end)0 877 y(end)1372 -1148 y Fp(Figure)30 b(3:)41 b(Op)s(ening)28 b(a)j(mo)s(dule.)p -0 1260 V 0 1518 a Fn(if)47 b(modulename)e(then)i(return)f(end)95 -b(--)47 b(avoid)f(loading)g(twice)g(the)h(same)g(module)0 -1631 y(modulename)e(=)i({})95 b(--)48 b(create)e(a)h(table)f(to)i -(represent)d(the)i(module)0 1818 y Fp(After)31 b(that,)g(functions)e -(can)h(b)s(e)g(directly)f(de\014ned)g(with)g(the)i(syn)m(tax)0 -2006 y Fn(function)46 b(modulename.foo)d(\(...\))95 2119 -y(...)0 2232 y(end)141 2419 y Fp(An)m(y)28 b(co)s(de)f(that)h(needs)f -(this)g(mo)s(dule)f(has)h(only)f(to)j(execute)f Fn -(dofile\("filename"\))p Fp(,)c(where)j Fn(filename)e -Fp(is)0 2532 y(the)31 b(\014le)e(where)h(the)g(mo)s(dule)f(is)h -(written.)39 b(After)31 b(this,)f(an)m(y)g(function)f(can)i(b)s(e)f -(called)f(with)0 2720 y Fn(modulename.foo\(...\))141 -2908 y Fp(If)i(a)h(mo)s(dule)e(function)g(is)g(going)h(to)i(b)s(e)d -(used)h(man)m(y)g(times,)h(the)f(program)h(can)f(giv)m(e)h(a)g(lo)s -(cal)f(name)g(to)h(it.)0 3021 y(Because)g(functions)d(are)h(v)-5 -b(alues,)30 b(it)g(is)g(enough)g(to)h(write)0 3208 y -Fn(localname)45 b(=)j(modulename.foo)0 3396 y Fp(Finally)-8 -b(,)30 b(a)i(mo)s(dule)e(ma)m(y)i(b)s(e)f Fo(op)-5 b(ene)g(d)p -Fp(,)34 b(giving)d(direct)g(access)h(to)h(all)d(its)h(functions,)g(as)h -(sho)m(wn)e(in)h(the)g(co)s(de)h(in)0 3509 y(Figure)e(3.)0 -3752 y Ff(8.9)112 b(A)37 b(CF)-9 b(unction)0 3924 y Fp(A)35 -b(CF)-8 b(unction)34 b(to)h(compute)g(the)f(maxim)m(um)g(of)g(a)h(v)-5 -b(ariable)34 b(n)m(um)m(b)s(er)f(of)i(argumen)m(ts)g(is)e(sho)m(wn)h -(in)f(Figure)h(4.)0 4037 y(After)d(registered)f(with)0 -4224 y Fn(lua_register)44 b(\("max",)i(math_max\);)0 -4412 y Fp(this)29 b(function)g(is)h(a)m(v)-5 b(ailable)29 -b(in)h(Lua,)g(as)g(follo)m(ws:)0 4600 y Fn(i)47 b(=)h(max\(4,)e(5,)h -(10,)g(-34\))94 b(--)48 b(i)f(receives)f(10)0 4843 y -Ff(8.10)112 b(Calling)36 b(Lua)i(F)-9 b(unctions)0 5015 -y Fp(This)31 b(example)i(illustrates)e(ho)m(w)i(a)g(C)g(function)e(can) -i(call)g(the)g(Lua)f(function)g Fn(remove_blanks)d Fp(presen)m(ted)k -(in)0 5128 y(Section)d(8.3.)1905 5589 y(30)p eop -%%Page: 31 31 -31 30 bop 0 1148 3900 12 v 0 1336 a Fn(void)47 b(math_max)e(\(void\))0 -1449 y({)48 1562 y(int)i(i=1;)142 b(/*)47 b(number)f(of)h(arguments)e -(*/)48 1675 y(double)h(d,)h(dmax;)48 1788 y(lua_Object)e(o;)48 -1900 y(/*)i(the)g(function)e(must)i(get)g(at)g(least)f(one)h(argument)f -(*/)48 2013 y(if)h(\(\(o)g(=)g(lua_getparam\(i++\)\))c(==)k -(LUA_NOOBJECT\))143 2126 y(lua_error)e(\("too)i(few)g(arguments)e(to)i -(function)f(`max'"\);)48 2239 y(/*)h(and)g(this)f(argument)g(must)h(be) -g(a)g(number)f(*/)48 2352 y(if)h(\(!lua_isnumber\(o\)\))143 -2465 y(lua_error)e(\("incorrect)g(argument)h(to)h(function)e(`max'"\);) -48 2578 y(dmax)h(=)i(lua_getnumber)c(\(o\);)48 2691 y(/*)j(loops)f -(until)h(there)f(is)h(no)g(more)g(arguments)e(*/)48 2804 -y(while)h(\(\(o)h(=)g(lua_getparam\(i++\)\))c(!=)k(LUA_NOOBJECT\))48 -2917 y({)95 3030 y(if)h(\(!lua_isnumber\(o\)\))191 3142 -y(lua_error)d(\("incorrect)g(argument)g(to)j(function)d(`max'"\);)95 -3255 y(d)j(=)f(lua_getnumber)e(\(o\);)95 3368 y(if)j(\(d)f(>)g(dmax\))g -(dmax)f(=)i(d;)48 3481 y(})48 3594 y(/*)f(push)g(the)f(result)h(to)g -(be)g(returned)e(*/)48 3707 y(lua_pushnumber)f(\(dmax\);)0 -3820 y(})1328 4091 y Fp(Figure)30 b(4:)41 b(C)30 b(function)f -Fn(math)p 2376 4091 29 4 v 33 w(max)p Fp(.)p 0 4204 3900 -12 v 1905 5589 a(31)p eop -%%Page: 32 32 -32 31 bop 0 91 a Fn(void)47 b(remove_blanks)d(\(char)i(*s\))0 -204 y({)95 317 y(lua_pushstring\(s\);)91 b(/*)47 b(prepare)f(parameter) -f(*/)95 430 y(lua_call\("remove_blanks"\);)89 b(/*)47 -b(call)g(Lua)g(function)e(*/)95 543 y(strcpy\(s,)h -(lua_getstring\(lua_getre)o(sult)o(\(1\)\))o(\);)89 b(/*)47 -b(copy)g(result)f(back)h(to)g('s')g(*/)0 656 y(})0 942 -y Fq(9)135 b(Lua)44 b(Stand-alone)0 1145 y Fp(Although)39 -b(Lua)g(has)h(b)s(een)f(designed)g(as)h(an)f(extension)h(language,)i -(the)e(language)h(can)f(also)f(b)s(e)h(used)f(as)h(a)0 -1258 y(stand-alone)33 b(in)m(terpreter.)47 b(An)32 b(implemen)m(tation) -f(of)i(suc)m(h)f(an)h(in)m(terpreter,)g(called)f(simply)e -Fn(lua)p Fp(,)j(is)e(pro)m(vided)0 1371 y(with)38 b(the)h(standard)f -(distribution.)63 b(This)37 b(program)h(can)i(b)s(e)e(called)g(with)g -(an)m(y)h(sequence)g(of)g(the)g(follo)m(wing)0 1484 y(argumen)m(ts:)0 -1672 y Fn(-v)45 b Fp(prin)m(ts)29 b(v)m(ersion)h(information.)0 -1859 y Fn(-)45 b Fp(runs)29 b(in)m(teractiv)m(ely)-8 -b(,)31 b(accepting)g(commands)f(from)g(standard)g(input)e(un)m(til)h -(an)h Fn(EOF)p Fp(.)0 2047 y Fn(-e)47 b(stat)e Fp(executes)31 -b Fn(stat)e Fp(as)i(a)g(Lua)f(c)m(h)m(unk.)0 2234 y Fn(var=exp)44 -b Fp(executes)31 b Fn(var=exp)e Fp(as)h(a)h(Lua)f(c)m(h)m(unk.)0 -2422 y Fn(filename)43 b Fp(executes)32 b(\014le)d Fn(filename)f -Fp(as)j(a)g(Lua)f(c)m(h)m(unk.)0 2610 y(All)f(argumen)m(ts)i(are)f -(handle)f(in)g(order.)41 b(F)-8 b(or)31 b(instance,)f(an)g(in)m(v)m(o)s -(cation)h(lik)m(e)0 2797 y Fn($)47 b(lua)g(-)h(a=1)f(prog.lua)0 -2985 y Fp(will)25 b(\014rst)j(in)m(teract)g(with)f(the)h(user)g(un)m -(til)e(an)i Fn(EOF)p Fp(,)f(then)h(will)d(set)k Fn(a)f -Fp(to)g(1,)i(and)d(\014nally)f(will)f(run)i(\014le)g -Fn(prog.lua)p Fp(.)141 3098 y(Please)32 b(notice)g(that)g(the)g(in)m -(teraction)g(with)e(the)i(shell)e(ma)m(y)i(lead)f(to)i(unin)m(tended)c -(results.)44 b(F)-8 b(or)32 b(instance,)0 3211 y(a)f(call)e(lik)m(e)0 -3398 y Fn($)47 b(lua)g(a="name")f(prog.lua)0 3586 y Fp(will)32 -b Fo(not)j Fp(set)f Fn(a)g Fp(to)h(the)g(string)e Fn("name")p -Fp(.)51 b(Instead,)35 b(the)g(quotes)g(will)c(b)s(e)j(handled)e(b)m(y)i -(the)h(shell,)f(lua)f(will)f(get)0 3699 y(only)d Fn(a=name)g -Fp(to)i(run,)e(and)h Fn(a)g Fp(will)e(\014nish)g(with)h -Fm(nil)p Fp(.)41 b(Instead,)30 b(one)h(should)d(write)0 -3887 y Fn($)47 b(lua)g('a="name"')e(prog.lua)0 4173 y -Fq(Ac)l(kno)l(wledgmen)l(ts)0 4376 y Fp(The)28 b(authors)g(w)m(ould)f -(lik)m(e)h(to)h(thank)g(CENPES/PETR)m(OBR)2191 4353 y(\023)2180 -4376 y(AS)e(whic)m(h,)h(join)m(tly)f(with)g Fa(T)-8 b(eC)3231 -4404 y(Graf)3395 4376 y Fp(,)29 b(used)f(exten-)0 4489 -y(siv)m(ely)35 b(early)g(v)m(ersions)f(of)i(this)e(system)i(and)f(ga)m -(v)m(e)j(v)-5 b(aluable)34 b(commen)m(ts.)57 b(The)35 -b(authors)g(w)m(ould)f(also)h(lik)m(e)g(to)0 4602 y(thank)30 -b(Carlos)g(Henrique)f(Levy)-8 b(,)31 b(who)f(found)f(the)i(name)f(of)g -(the)h(game.)42 b(Lua)30 b(means)g Fo(mo)-5 b(on)32 b -Fp(in)d(P)m(ortuguese.)0 4888 y Fq(Incompatibilities)47 -b(with)f(Previous)f(V)-11 b(ersions)0 5091 y Fp(Although)29 -b(great)i(care)g(has)f(b)s(een)f(tak)m(en)i(to)g(a)m(v)m(oid)g -(incompatibilities)26 b(with)i(the)j(previous)d(public)f(v)m(ersions)j -(of)0 5204 y(Lua,)g(some)h(di\013erences)f(had)g(to)h(b)s(e)e(in)m(tro) -s(duced.)40 b(Here)30 b(is)g(a)h(list)e(of)h(all)f(these)i -(incompatibilities.)1905 5589 y(32)p eop -%%Page: 33 33 -33 32 bop 0 91 a Ff(Incompatibilities)33 b(with)j(v)m(ersion)h(2.4)0 -263 y Fp(The)28 b(whole)f(I/O)i(facilities)d(ha)m(v)m(e)k(b)s(een)d -(rewritten.)39 b(W)-8 b(e)30 b(strongly)e(encourage)h(programmers)f(to) -h(addapt)f(their)0 376 y(co)s(de)c(to)g(this)e(new)g(v)m(ersion.)38 -b(Ho)m(w)m(ev)m(er,)27 b(w)m(e)d(are)g(k)m(eeping)f(the)g(old)g(v)m -(ersion)g(of)g(the)g(libraries)e(in)h(the)h(distribution,)0 -489 y(to)31 b(allo)m(w)f(a)h(smo)s(oth)f(transition.)39 -b(The)30 b(incompatibilities)c(b)s(et)m(w)m(een)31 b(the)g(new)f(and)g -(the)g(old)g(libraries)d(are:)136 676 y Fk(\017)46 b -Fp(The)35 b(format)g(facilit)m(y)e(of)i(function)f Fn(write)f -Fp(has)i(b)s(een)f(sup)s(ersed)e(b)m(y)j(function)e Fn(format)p -Fp(;)j(therefore)f(this)227 789 y(facilit)m(y)30 b(has)g(b)s(een)g -(dropp)s(ed.)136 977 y Fk(\017)46 b Fp(F)-8 b(unction)32 -b Fn(read)f Fp(no)m(w)h(uses)f Fo(r)-5 b(e)g(ad)36 b(p)-5 -b(atterns)34 b Fp(to)f(sp)s(ecify)e(what)g(to)i(read;)g(this)e(is)g -(incompatible)f(with)h(the)227 1090 y(old)f(format)g(options.)136 -1277 y Fk(\017)46 b Fp(F)-8 b(unction)25 b Fn(strfind)f -Fp(no)m(w)i(accepts)g(patterns,)h(so)f(it)f(ma)m(y)h(ha)m(v)m(e)h(a)f -(di\013eren)m(t)f(b)s(eha)m(vior)g(when)f(the)i(pattern)227 -1390 y(includes)i(sp)s(ecial)h(c)m(haracteres.)0 1634 -y Ff(Incompatibilities)k(with)j(v)m(ersion)h(2.2)136 -1805 y Fk(\017)46 b Fp(F)-8 b(unctions)40 b Fn(date)g -Fp(and)g Fn(time)f Fp(\(from)h Fn(iolib)p Fp(\))g(ha)m(v)m(e)h(b)s(een) -f(sup)s(erseded)f(b)m(y)h(the)h(new,)i(more)d(p)s(o)m(w)m(erful)227 -1918 y(v)m(ersion)30 b(of)h(function)e Fn(date)p Fp(.)136 -2106 y Fk(\017)46 b Fp(F)-8 b(unction)35 b Fn(append)e -Fp(\(from)h Fn(iolib)p Fp(\))g(no)m(w)h(returns)e(1)i(whenev)m(er)g(it) -f(succeeds,)j(whether)d(the)h(\014le)f(is)f(new)227 2219 -y(or)e(not.)136 2407 y Fk(\017)46 b Fp(F)-8 b(unction)29 -b Fn(int2str)e Fp(\(from)i Fn(strlib)p Fp(\))f(has)h(b)s(een)f(sup)s -(erseded)f(b)m(y)i(new)g(function)e Fn(format)p Fp(,)h(with)g(param-) -227 2519 y(eter)j Fn("\045c")p Fp(.)136 2707 y Fk(\017)46 -b Fp(The)30 b(API)g(lo)s(c)m(k)g(mec)m(hanism)f(has)h(b)s(een)g(sup)s -(erseded)e(b)m(y)i(the)g(reference)h(mec)m(hanism.)40 -b(Ho)m(w)m(ev)m(er,)32 b Fn(lua.h)227 2820 y Fp(pro)m(vides)e -(compatibilit)m(y)e(macros,)j(so)g(there)f(is)g(no)g(need)g(to)h(c)m -(hange)h(programs.)136 3008 y Fk(\017)46 b Fp(The)30 -b(API)g(function)f Fn(lua_pushliteral)e Fp(no)m(w)j(is)f(just)h(a)h -(macro)g(to)g Fn(lua_pushstring)p Fp(.)0 3251 y Ff(Incompatibilities)i -(with)j(v)m(ersion)h(2.1)136 3423 y Fk(\017)46 b Fp(The)25 -b(function)e Fn(type)h Fp(no)m(w)h(returns)f(the)h(string)f -Fn("function")e Fp(b)s(oth)j(for)f(C)h(and)f(Lua)h(functions.)38 -b(Because)227 3536 y(Lua)e(functions)e(and)h(C)g(functions)g(are)h -(compatible,)g(this)f(b)s(eha)m(vior)g(is)g(usually)e(more)j(useful.)55 -b(When)227 3648 y(needed,)37 b(the)f(second)g(result)f(of)h(function)f -Fn(type)g Fp(ma)m(y)h(b)s(e)f(used)g(to)i(distinguish)32 -b(b)s(et)m(w)m(een)k(Lua)g(and)f(C)227 3761 y(functions.)136 -3949 y Fk(\017)46 b Fp(A)31 b(function)d(de\014nition)g(only)h(assigns) -h(the)g(function)f(v)-5 b(alue)29 b(to)i(the)g(giv)m(en)f(v)-5 -b(ariable)29 b(at)i(execution)f(time.)0 4192 y Ff(Incompatibilities)j -(with)j(v)m(ersion)h(1.1)136 4364 y Fk(\017)46 b Fp(The)30 -b(equalit)m(y)g(test)h(op)s(erator)g(no)m(w)f(is)g(denoted)g(b)m(y)h -Fn(==)p Fp(,)f(instead)f(of)i Fn(=)p Fp(.)136 4552 y -Fk(\017)46 b Fp(The)25 b(syn)m(tax)h(for)f(table)g(construction)g(has)h -(b)s(een)e(greatly)i(simpli\014ed.)35 b(The)25 b(old)g -Fn(@\(size\))e Fp(has)i(b)s(een)g(sub-)227 4665 y(stituted)31 -b(b)m(y)g Fn({})p Fp(.)43 b(The)31 b(list)f(constructor)i(\(formerly)e -Fn(@[...])p Fp(\))g(and)h(the)h(record)f(constructor)h(\(formerly)227 -4778 y Fn(@{...})p Fp(\))d(no)m(w)g(are)h(b)s(oth)f(co)s(ded)g(lik)m(e) -g Fn({...})p Fp(.)39 b(When)30 b(the)f(construction)g(in)m(v)m(olv)m -(es)h(a)g(function)e(call,)i(lik)m(e)227 4890 y(in)f -Fn(@func{...})p Fp(,)e(the)j(new)f(syn)m(tax)i(do)s(es)e(not)h(use)g -(the)g Fn(@)p Fp(.)40 b(More)30 b(imp)s(ortan)m(t,)g -Fo(a)i(c)-5 b(onstruction)34 b(function)227 5003 y(must)f(now)h -(explicitly)f(r)-5 b(eturn)34 b(the)f(c)-5 b(onstructe)g(d)34 -b(table)p Fp(.)136 5191 y Fk(\017)46 b Fp(The)30 b(function)f -Fn(lua_call)f Fp(no)j(longer)f(has)g(the)g(parameter)h -Fn(nparam)p Fp(.)1905 5589 y(33)p eop -%%Page: 34 34 -34 33 bop 136 91 a Fk(\017)46 b Fp(The)d(function)f Fn(lua_pop)f -Fp(is)h(no)h(longer)g(a)m(v)-5 b(ailable,)46 b(since)c(it)h(could)f -(lead)h(to)h(strange)g(b)s(eha)m(vior.)78 b(In)227 204 -y(particular,)39 b(to)g(access)g(results)e(returned)g(from)h(a)h(Lua)f -(function,)h(the)f(new)g(macro)h Fn(lua_getresult)227 -317 y Fp(should)29 b(b)s(e)g(used.)136 505 y Fk(\017)46 -b Fp(The)30 b(old)g(functions)f Fn(lua_storefield)d Fp(and)k -Fn(lua_storeindexed)c Fp(ha)m(v)m(e)31 b(b)s(een)f(replaced)g(b)m(y)227 -730 y Fn(int)47 b(lua_storesubscript)c(\(void\);)227 -955 y Fp(with)29 b(the)i(parameters)g(explicitly)d(pushed)g(on)i(the)h -(stac)m(k.)136 1142 y Fk(\017)46 b Fp(The)23 b(functionalit)m(y)f(of)i -(the)g(function)e Fn(lua_errorfunction)d Fp(has)24 b(b)s(een)e -(replaced)i(b)m(y)f(the)h Fo(fal)5 b(lb)-5 b(ack)24 b -Fp(mec)m(h-)227 1255 y(anism)29 b(\(see)j(Section)e(4.8\).)136 -1443 y Fk(\017)46 b Fp(When)31 b(calling)e(a)j(function)d(from)i(the)g -(Lua)g(library)-8 b(,)29 b(parameters)i(passed)g(through)f(the)h(stac)m -(k)i(m)m(ust)e(b)s(e)227 1556 y(pushed)36 b(just)h(b)s(efore)h(the)g -(corresp)s(onding)d(call,)40 b(with)c(no)i(in)m(termediate)f(calls)g -(to)i(Lua.)62 b(Sp)s(ecial)36 b(care)227 1669 y(should)29 -b(b)s(e)g(tak)m(en)j(with)d(macros)i(lik)m(e)e Fn(lua_getindexed)e -Fp(and)j Fn(lua_getfield)p Fp(.)1905 5589 y(34)p eop -%%Page: 35 35 -35 34 bop 0 220 a Fq(Index)0 401 y Fp(..)41 b(6)0 514 -y(abs)30 b(20)0 627 y(acos)h(20)0 740 y(Adjustmen)m(t)f(3)0 -853 y(and)g(6)0 966 y(app)s(endto)g(21)0 1079 y(argumen)m(ts)h(8)0 -1192 y(arithmetic)f(fallbac)m(k)g(9)0 1305 y(arithmetic)g(op)s(erators) -g(5)0 1418 y(arra)m(ys)h(2)0 1530 y(ascii)f(18)0 1643 -y(asin)f(20)0 1756 y(assert)i(16)0 1869 y(Assignmen)m(t)f(4)0 -1982 y(asso)s(ciativ)m(e)h(arra)m(ys)g(2)0 2095 y(atan)g(20)0 -2208 y(atan2)h(20)0 2321 y(basic)e(t)m(yp)s(es)g(2)0 -2434 y(blo)s(c)m(k)g(4)0 2547 y(C)g(p)s(oin)m(ters)f(2)0 -2660 y(captures)h(20)0 2772 y(ceil)g(20)0 2885 y(CF)-8 -b(unction)30 b(2)0 2998 y(c)m(haracter)i(class)e(19)0 -3111 y(c)m(h)m(unk)g(2)0 3224 y(clone)g(24)0 3337 y(closing)f(a)i -(\014le)f(21)0 3450 y(Co)s(ercion)g(3)0 3563 y(Commen)m(ts)h(3)0 -3676 y(concatenation)h(fallbac)m(k)e(9)0 3789 y(concatenation)i(6)0 -3902 y(condition)d(expression)g(4)0 4014 y(constructors)i(6)0 -4127 y(cos)g(20)0 4240 y(Data)h(Structures)d(24)0 4353 -y(date)i(22)0 4466 y(debug)f(pragma)g(10)0 4579 y(do\014le)f(15)0 -4692 y(dostring)g(15)0 4805 y(error)h(fallbac)m(k)g(10)0 -4918 y(error)g(16)0 5031 y(execute)i(22)0 5144 y(exit)e(22)0 -5256 y(exp)s(onen)m(tiation)g(5)2095 401 y(Expressions)f(5)2095 -514 y(fallbac)m(ks)h(9)2095 627 y(\015o)s(or)g(20)2095 -740 y(format)h(18)2095 853 y(function)e(call)h(7)2095 -966 y(F)-8 b(unction)30 b(De\014nitions)f(8)2095 1079 -y(function)g(fallbac)m(k)h(9)2095 1192 y(function)f(2)2095 -1305 y(functions)g(in)g(C)h(30)2095 1418 y(geten)m(v)i(22)2095 -1530 y(getglobal)f(17)2095 1643 y(gettable)h(fallbac)m(k)e(9)2095 -1756 y(global)g(en)m(vironmen)m(t)g(2)2095 1869 y(Global)g(v)-5 -b(ariables)29 b(2)2095 1982 y(gsub)h(18)2095 2095 y(Iden)m(ti\014ers)f -(3)2095 2208 y(if-then-else)h(4)2095 2321 y(index)f(fallbac)m(k)h(9) -2095 2434 y(index)f(getglobal)i(9)2095 2547 y(inheritance)e(26)2095 -2660 y(Literal)h(strings)f(3)2095 2772 y(Lo)s(cal)i(v)-5 -b(ariables)29 b(5)2095 2885 y(log10)j(20)2095 2998 y(log)f(20)2095 -3111 y(logical)f(op)s(erators)h(6)2095 3224 y(Lua)f(Stand-alone)g(32) -2095 3337 y(luac)g(11)2095 3450 y(luac)g(2)2095 3563 -y(lua)p 2222 3563 28 4 v 32 w(call)g(13)2095 3676 y(lua)p -2222 3676 V 32 w(callfunction)f(13)2095 3789 y(lua)p -2222 3789 V 32 w(CF)-8 b(unction)30 b(14)2095 3902 y(lua)p -2222 3902 V 32 w(createtable)i(13)2095 4014 y(lua)p 2222 -4014 V 32 w(do\014le)e(10)2095 4127 y(lua)p 2222 4127 -V 32 w(dostring)g(10)2095 4240 y(lua)p 2222 4240 V 32 -w(error)g(13)2095 4353 y(lua)p 2222 4353 V 32 w(getcfunction)h(11)2095 -4466 y(lua)p 2222 4466 V 32 w(getglobal)g(12)2095 4579 -y(lua)p 2222 4579 V 32 w(getn)m(um)m(b)s(er)g(11)2095 -4692 y(lua)p 2222 4692 V 32 w(getparam)h(14)2095 4805 -y(lua)p 2222 4805 V 32 w(getref)g(14)2095 4918 y(lua)p -2222 4918 V 32 w(getresult)f(13)2095 5031 y(lua)p 2222 -5031 V 32 w(getstring)g(11)2095 5144 y(lua)p 2222 5144 -V 32 w(getsubscript)f(12)2095 5256 y(lua)p 2222 5256 -V 32 w(getuserdata)i(11)1905 5589 y(35)p eop -%%Page: 36 36 -36 35 bop 0 91 a Fp(lua)p 127 91 28 4 v 32 w(iscfunction)29 -b(11)0 204 y(lua)p 127 204 V 32 w(isfunction)f(11)0 317 -y(lua)p 127 317 V 32 w(isnil)f(11)0 430 y(lua)p 127 430 -V 32 w(isn)m(um)m(b)s(er)h(11)0 543 y(lua)p 127 543 V -32 w(isstring)g(11)0 656 y(lua)p 127 656 V 32 w(istable)h(11)0 -769 y(lua)p 127 769 V 32 w(isuserdata)g(11)0 882 y(LUA)p -198 882 V 33 w(NOOBJECT)g(14)0 995 y(lua)p 127 995 V -32 w(Ob)5 b(ject)30 b(11)0 1108 y(lua)p 127 1108 V 32 -w(pushcfunction)e(12)0 1220 y(lua)p 127 1220 V 32 w(pushnil)f(12)0 -1333 y(lua)p 127 1333 V 32 w(pushn)m(um)m(b)s(er)g(12)0 -1446 y(lua)p 127 1446 V 32 w(pushob)5 b(ject)30 b(12)0 -1559 y(lua)p 127 1559 V 32 w(pushref)e(14)0 1672 y(lua)p -127 1672 V 32 w(pushstring)g(12)0 1785 y(lua)p 127 1785 -V 32 w(push)m(userdata)h(12)0 1898 y(lua)p 127 1898 V -32 w(push)m(usertag)h(12)0 2011 y(lua)p 127 2011 V 32 -w(ref)g(14)0 2124 y(lua)p 127 2124 V 32 w(register)g(14)0 -2237 y(lua)p 127 2237 V 32 w(setfallbac)m(k)g(14)0 2350 -y(lua)p 127 2350 V 32 w(storeglobal)g(12)0 2462 y(lua)p -127 2462 V 32 w(storesubscript)f(12)0 2575 y(lua)p 127 -2575 V 32 w(t)m(yp)s(e)h(11)0 2688 y(lua)p 127 2688 V -32 w(unref)f(14)0 2801 y(max)h(20)0 2914 y(metho)s(ds)g(8)0 -3027 y(min)f(20)0 3140 y(mo)s(d)h(20)0 3253 y(Mo)s(dules)f(27)0 -3366 y(m)m(ultiple)f(assignmen)m(t)i(4)0 3479 y(next)h(15)0 -3592 y(next)g(24)0 3704 y(nextv)-5 b(ar)31 b(16)0 3817 -y(nextv)-5 b(ar)31 b(24)0 3930 y(nil)d(2)0 4043 y(not)j(6)0 -4156 y(n)m(um)m(b)s(er)e(2)0 4269 y(Numerical)g(constan)m(ts)j(3)0 -4382 y(Op)s(erator)e(precedence)h(6)0 4495 y(or)f(6)0 -4608 y(order)g(fallbac)m(k)g(9)0 4721 y(pattern)g(item)h(19)0 -4834 y(pattern)f(20)0 4946 y(P)m(ersistence)h(26)0 5059 -y(pip)s(ed)d(input)g(20)0 5172 y(pip)s(ed)g(output)i(21)0 -5285 y(p)s(op)s(en)f(20)2095 91 y(p)s(op)s(en)g(21)2095 -204 y(pre-compilation)g(2)2095 317 y(prede\014ned)g(functions)g(15)2095 -430 y(prin)m(t)g(16)2095 543 y(Programming)h(with)f(Classes)g(27)2095 -656 y(random)h(20)2095 769 y(randomseed)g(20)2095 882 -y(read)h(pattern)f(21)2095 995 y(read)h(21)2095 1108 -y(readfrom)f(20)2095 1220 y(records)g(2)2095 1333 y(reference)h(14)2095 -1446 y(re\015exivit)m(y)f(15)2095 1559 y(relational)g(op)s(erators)g(5) -2095 1672 y(remo)m(v)m(e)i(21)2095 1785 y(rename)f(21)2095 -1898 y(rep)s(eat-un)m(til)e(4)2095 2011 y(reserv)m(ed)i(w)m(ords)f(3) -2095 2124 y(return)g(statemen)m(t)i(5)2095 2237 y(return)e(4)2095 -2350 y(self)g(8)2095 2462 y(setfallbac)m(k)h(10)2095 -2575 y(setfallbac)m(k)g(17)2095 2688 y(setglobal)g(17)2095 -2801 y(settable)g(fallbac)m(k)f(9)2095 2914 y(short-cut)h(ev)-5 -b(aluation)30 b(6)2095 3027 y(Simple)e(Expressions)h(5)2095 -3140 y(sin)g(20)2095 3253 y(skips)g(21)2095 3366 y(sqrt)h(20)2095 -3479 y(statemen)m(ts)i(4)2095 3592 y(str\014nd)d(17)2095 -3704 y(string)h(2)2095 3817 y(strlen)g(17)2095 3930 y(strlo)m(w)m(er)h -(17)2095 4043 y(strrep)f(18)2095 4156 y(strsub)f(17)2095 -4269 y(strupp)s(er)f(17)2095 4382 y(table)j(2)2095 4495 -y(tag)h(16)2095 4608 y(tan)f(20)2095 4721 y(tmpname)f(21)2095 -4834 y(tok)m(ens)i(3)2095 4946 y(ton)m(um)m(b)s(er)e(16)2095 -5059 y(tostring)g(16)2095 5172 y(t)m(yp)s(e)h(16)2095 -5285 y(T)m(yp)s(es)f(2)1905 5589 y(36)p eop -%%Page: 37 37 -37 36 bop 0 91 a Fp(userdata)30 b(2)0 204 y(V)-8 b(ariable)30 -b(n)m(um)m(b)s(er)f(of)h(argumen)m(ts)h(25)0 317 y(v)m(ersion)f(1.1)h -(33)0 430 y(v)m(ersion)f(2.1)h(33)0 543 y(v)m(ersion)f(2.2)h(33)0 -656 y(v)m(ersion)f(2.4)h(33)0 769 y(while-do)e(4)0 882 -y(write)h(22)0 995 y(writeto)g(20)1905 5589 y(37)p eop -%%Page: 38 38 -38 37 bop 0 91 a Fq(Con)l(ten)l(ts)0 295 y Fm(1)84 b(In)m(tro)s -(duction)3136 b(1)0 499 y(2)84 b(En)m(vironmen)m(t)35 -b(and)f(Ch)m(unks)2540 b(2)0 703 y(3)84 b(T)m(yp)s(es)3437 -b(2)0 907 y(4)84 b(The)35 b(Language)3065 b(3)136 1020 -y Fp(4.1)94 b(Lexical)30 b(Con)m(v)m(en)m(tions)83 b(.)45 -b(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f -(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.) -131 b(3)136 1132 y(4.2)94 b(Co)s(ercion)33 b(.)45 b(.)h(.)g(.)g(.)f(.)h -(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.) -g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g -(.)f(.)131 b(3)136 1245 y(4.3)94 b(Adjustmen)m(t)58 b(.)46 -b(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g -(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.) -g(.)f(.)h(.)g(.)f(.)131 b(3)136 1358 y(4.4)94 b(Statemen)m(ts)85 -b(.)46 b(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.) -h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f -(.)h(.)g(.)f(.)h(.)g(.)f(.)131 b(4)345 1471 y(4.4.1)106 -b(Blo)s(c)m(ks)47 b(.)f(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h -(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.) -g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 b(4)345 1584 -y(4.4.2)106 b(Assignmen)m(t)57 b(.)46 b(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f -(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.) -h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 b(4)345 1697 -y(4.4.3)106 b(Con)m(trol)30 b(Structures)59 b(.)46 b(.)f(.)h(.)g(.)f(.) -h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h -(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 b(4)345 1810 -y(4.4.4)106 b(F)-8 b(unction)30 b(Calls)f(as)i(Statemen)m(ts)64 -b(.)46 b(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.) -h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 b(5)345 1923 -y(4.4.5)106 b(Lo)s(cal)31 b(Declarations)60 b(.)46 b(.)f(.)h(.)g(.)f(.) -h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h -(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 b(5)136 2036 -y(4.5)94 b(Expressions)59 b(.)46 b(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f -(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.) -h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 -b(5)345 2149 y(4.5.1)106 b(Simple)28 b(Expressions)36 -b(.)46 b(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.) -g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 -b(5)345 2262 y(4.5.2)106 b(Arithmetic)30 b(Op)s(erators)81 -b(.)46 b(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.) -f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 -b(5)345 2374 y(4.5.3)106 b(Relational)30 b(Op)s(erators)38 -b(.)45 b(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.) -g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 -b(5)345 2487 y(4.5.4)106 b(Logical)31 b(Op)s(erators)88 -b(.)46 b(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.) -g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 -b(6)345 2600 y(4.5.5)106 b(Concatenation)84 b(.)46 b(.)g(.)g(.)f(.)h(.) -g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g -(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 b(6)345 -2713 y(4.5.6)106 b(Precedence)78 b(.)46 b(.)f(.)h(.)g(.)g(.)f(.)h(.)g -(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.) -f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 b(6)345 -2826 y(4.5.7)106 b(T)-8 b(able)30 b(Constructors)39 b(.)46 -b(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g -(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 -b(6)345 2939 y(4.5.8)106 b(F)-8 b(unction)30 b(Calls)80 -b(.)46 b(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.) -f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f -(.)131 b(7)136 3052 y(4.6)94 b(F)-8 b(unction)31 b(De\014nitions)69 -b(.)45 b(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.) -g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g -(.)f(.)131 b(8)136 3165 y(4.7)94 b(F)-8 b(allbac)m(ks)90 -b(.)46 b(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.) -f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g -(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)131 b(9)136 3278 y(4.8)94 -b(Error)30 b(Handling)60 b(.)45 b(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g -(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.) -f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 b(10)0 -3482 y Fm(5)f(The)35 b(Application)g(Program)g(In)m(terface)2041 -b(10)136 3594 y Fp(5.1)94 b(Executing)30 b(Lua)h(Co)s(de)63 -b(.)45 b(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.) -g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g -(.)f(.)85 b(10)136 3707 y(5.2)94 b(Con)m(v)m(erting)31 -b(V)-8 b(alues)30 b(b)s(et)m(w)m(een)h(C)f(and)g(Lua)54 -b(.)45 b(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.) -g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 b(11)136 3820 -y(5.3)94 b(Manipulating)29 b(Lua)h(Ob)5 b(jects)39 b(.)46 -b(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g -(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 -b(12)136 3933 y(5.4)94 b(Calling)29 b(Lua)h(F)-8 b(unctions)67 -b(.)46 b(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.) -f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f -(.)85 b(13)136 4046 y(5.5)94 b(C)30 b(F)-8 b(unctions)44 -b(.)i(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h -(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.) -h(.)g(.)f(.)h(.)g(.)f(.)85 b(14)136 4159 y(5.6)94 b(References)31 -b(to)h(Lua)e(Ob)5 b(jects)42 b(.)k(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g -(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.) -g(.)f(.)h(.)g(.)f(.)85 b(14)0 4363 y Fm(6)f(Prede\014ned)36 -b(F)-9 b(unctions)36 b(and)e(Libraries)2051 b(15)136 -4476 y Fp(6.1)94 b(Prede\014ned)29 b(F)-8 b(unctions)43 -b(.)i(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g -(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.) -f(.)85 b(15)136 4589 y(6.2)94 b(String)29 b(Manipulation)72 -b(.)45 b(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.) -g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g -(.)f(.)85 b(17)136 4702 y(6.3)94 b(Mathematical)32 b(F)-8 -b(unctions)56 b(.)46 b(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f -(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.) -h(.)g(.)f(.)85 b(20)136 4814 y(6.4)94 b(I/O)31 b(F)-8 -b(acilities)66 b(.)46 b(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h -(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.) -g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 b(20)1905 5589 -y(38)p eop -%%Page: 39 39 -39 38 bop 0 91 a Fm(7)84 b(The)35 b(Debugger)h(In)m(terface)2566 -b(22)136 204 y Fp(7.1)94 b(Stac)m(k)32 b(and)e(F)-8 b(unction)30 -b(Information)e(.)46 b(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h -(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 -b(22)136 317 y(7.2)94 b(Manipulating)29 b(Lo)s(cal)h(V)-8 -b(ariables)58 b(.)46 b(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f -(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.) -85 b(23)136 430 y(7.3)94 b(Ho)s(oks)69 b(.)46 b(.)f(.)h(.)g(.)g(.)f(.)h -(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.) -g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g -(.)f(.)85 b(23)0 634 y Fm(8)f(Some)35 b(Examples)2939 -b(24)136 747 y Fp(8.1)94 b(Data)32 b(Structures)f(.)45 -b(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f -(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.) -h(.)g(.)f(.)85 b(24)136 860 y(8.2)94 b(The)30 b(F)-8 -b(unctions)30 b Fn(next)f Fp(and)h Fn(nextvar)38 b Fp(.)45 -b(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f -(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 b(24)136 -973 y(8.3)94 b(String)29 b(Manipulation)72 b(.)45 b(.)h(.)g(.)g(.)f(.)h -(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.) -g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 b(25)136 -1086 y(8.4)94 b(V)-8 b(ariable)30 b(n)m(um)m(b)s(er)f(of)i(argumen)m -(ts)c(.)46 b(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.) -g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 -b(25)136 1198 y(8.5)94 b(P)m(ersistence)87 b(.)46 b(.)g(.)f(.)h(.)g(.)f -(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.) -h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 -b(26)136 1311 y(8.6)94 b(Inheritance)78 b(.)46 b(.)g(.)f(.)h(.)g(.)f(.) -h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h -(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 -b(26)136 1424 y(8.7)94 b(Programming)30 b(with)f(Classes)e(.)46 -b(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g -(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 -b(27)136 1537 y(8.8)94 b(Mo)s(dules)50 b(.)45 b(.)h(.)g(.)g(.)f(.)h(.)g -(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.) -f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f -(.)85 b(27)136 1650 y(8.9)94 b(A)31 b(CF)-8 b(unction)82 -b(.)46 b(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.) -g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h -(.)g(.)f(.)h(.)g(.)f(.)85 b(30)136 1763 y(8.10)49 b(Calling)29 -b(Lua)h(F)-8 b(unctions)67 b(.)46 b(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)f -(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.) -f(.)h(.)g(.)f(.)h(.)g(.)f(.)85 b(30)0 1967 y Fm(9)f(Lua)35 -b(Stand-alone)2913 b(32)1905 5589 y Fp(39)p eop -%%Trailer -end -userdict /end-hook known{end-hook}if -%%EOF diff --git a/include/Makefile b/include/Makefile index e21de74..6cd0c92 100644 --- a/include/Makefile +++ b/include/Makefile @@ -4,7 +4,7 @@ LUA= .. include $(LUA)/config -SRCS= lua.h lualib.h luadebug.h +SRCS= lua.h lualib.h luadebug.h auxlib.h all: diff --git a/include/auxlib.h b/include/auxlib.h new file mode 100644 index 0000000..09020b4 --- /dev/null +++ b/include/auxlib.h @@ -0,0 +1,30 @@ +/* +** $Id: auxlib.h,v 1.3 1997/04/07 14:48:53 roberto Exp $ +*/ + +#ifndef auxlib_h +#define auxlib_h + +#include "lua.h" + +struct luaL_reg { + char *name; + lua_CFunction func; +}; + +void luaL_openlib (struct luaL_reg *l, int n); +void luaL_arg_check(int cond, int numarg, char *extramsg); +char *luaL_check_string (int numArg); +char *luaL_opt_string (int numArg, char *def); +double luaL_check_number (int numArg); +double luaL_opt_number (int numArg, double def); +void luaL_verror (char *fmt, ...); + + + +/* -- private part (only for Lua modules */ + +int luaI_findstring (char *name, char *list[]); + + +#endif diff --git a/include/lua.h b/include/lua.h index 6a515d5..b0409d6 100644 --- a/include/lua.h +++ b/include/lua.h @@ -1,61 +1,50 @@ /* -** LUA - Linguagem para Usuarios de Aplicacao -** Grupo de Tecnologia em Computacao Grafica -** TeCGraf - PUC-Rio -** $Id: lua.h,v 3.32 1996/11/20 13:49:32 roberto Exp $ +** LUA - An Extensible Extension Language +** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil +** e-mail: lua@tecgraf.puc-rio.br +** $Id: lua.h,v 4.11 1997/06/23 18:27:53 roberto Exp $ */ #ifndef lua_h #define lua_h -#define LUA_VERSION "Lua 2.5.1" -#define LUA_COPYRIGHT "Copyright (C) 1994-1996 TeCGraf" +#define LUA_VERSION "Lua 3.0" +#define LUA_COPYRIGHT "Copyright (C) 1994-1997 TeCGraf" #define LUA_AUTHORS "W. Celes, R. Ierusalimschy & L. H. de Figueiredo" -/* Private Part */ - -typedef enum -{ - LUA_T_NIL = -1, - LUA_T_NUMBER = -2, - LUA_T_STRING = -3, - LUA_T_ARRAY = -4, - LUA_T_FUNCTION = -5, - LUA_T_CFUNCTION= -6, - LUA_T_MARK = -7, - LUA_T_CMARK = -8, - LUA_T_LINE = -9, - LUA_T_USERDATA = 0 -} lua_Type; - - -/* Public Part */ - #define LUA_NOOBJECT 0 +#define LUA_ANYTAG (-1) + typedef void (*lua_CFunction) (void); typedef unsigned int lua_Object; -lua_Object lua_setfallback (char *name, lua_CFunction fallback); +lua_Object lua_settagmethod (int tag, char *event); /* In: new method */ +lua_Object lua_gettagmethod (int tag, char *event); +lua_Object lua_seterrormethod (void); /* In: new method */ + +int lua_newtag (void); +void lua_settag (int tag); /* In: object */ void lua_error (char *s); -int lua_dofile (char *filename); -int lua_dostring (char *string); -int lua_callfunction (lua_Object function); -int lua_call (char *funcname); +int lua_dofile (char *filename); /* Out: returns */ +int lua_dostring (char *string); /* Out: returns */ +int lua_callfunction (lua_Object f); + /* In: parameters; Out: returns */ void lua_beginblock (void); void lua_endblock (void); -lua_Object lua_getparam (int number); -#define lua_getresult(_) lua_getparam(_) +lua_Object lua_lua2C (int number); +#define lua_getparam(_) lua_lua2C(_) +#define lua_getresult(_) lua_lua2C(_) -#define lua_isnil(_) (lua_type(_)==LUA_T_NIL) -#define lua_istable(_) (lua_type(_)==LUA_T_ARRAY) -#define lua_isuserdata(_) (lua_type(_)>=LUA_T_USERDATA) -#define lua_iscfunction(_) (lua_type(_)==LUA_T_CFUNCTION) +int lua_isnil (lua_Object object); +int lua_istable (lua_Object object); +int lua_isuserdata (lua_Object object); +int lua_iscfunction (lua_Object object); int lua_isnumber (lua_Object object); int lua_isstring (lua_Object object); int lua_isfunction (lua_Object object); @@ -63,42 +52,73 @@ int lua_isfunction (lua_Object object); float lua_getnumber (lua_Object object); char *lua_getstring (lua_Object object); lua_CFunction lua_getcfunction (lua_Object object); -void *lua_getuserdata (lua_Object object); +void *lua_getuserdata (lua_Object object); + void lua_pushnil (void); void lua_pushnumber (float n); void lua_pushstring (char *s); void lua_pushcfunction (lua_CFunction fn); -void lua_pushusertag (void *u, int tag); +void lua_pushusertag (void *u, int tag); void lua_pushobject (lua_Object object); +lua_Object lua_pop (void); + lua_Object lua_getglobal (char *name); -void lua_storeglobal (char *name); +lua_Object lua_rawgetglobal (char *name); +void lua_setglobal (char *name); /* In: value */ +void lua_rawsetglobal (char *name); /* In: value */ -void lua_storesubscript (void); -lua_Object lua_getsubscript (void); +void lua_settable (void); /* In: table, index, value */ +void lua_rawsettable (void); /* In: table, index, value */ +lua_Object lua_gettable (void); /* In: table, index */ +lua_Object lua_rawgettable (void); /* In: table, index */ -int lua_type (lua_Object object); +int lua_tag (lua_Object object); -int lua_ref (int lock); +int lua_ref (int lock); /* In: value */ lua_Object lua_getref (int ref); -void lua_pushref (int ref); void lua_unref (int ref); lua_Object lua_createtable (void); +long lua_collectgarbage (long limit); + +/* =============================================================== */ /* some useful macros */ +#define lua_call(name) lua_callfunction(lua_getglobal(name)) + +#define lua_pushref(ref) lua_pushobject(lua_getref(ref)) + #define lua_refobject(o,l) (lua_pushobject(o), lua_ref(l)) -#define lua_register(n,f) (lua_pushcfunction(f), lua_storeglobal(n)) +#define lua_register(n,f) (lua_pushcfunction(f), lua_setglobal(n)) + +#define lua_pushuserdata(u) lua_pushusertag(u, 0) -#define lua_pushuserdata(u) lua_pushusertag(u, LUA_T_USERDATA) -/* for compatibility with old versions. Avoid using these macros */ + +/* ========================================================================== +** for compatibility with old versions. Avoid using these macros/functions +** If your program does not use any of these, define LUA_COMPAT2_5 to 0 +*/ + +#ifndef LUA_COMPAT2_5 +#define LUA_COMPAT2_5 1 +#endif + + +#if LUA_COMPAT2_5 + + +lua_Object lua_setfallback (char *event, lua_CFunction fallback); + +#define lua_storeglobal lua_setglobal +#define lua_type lua_tag #define lua_lockobject(o) lua_refobject(o,1) #define lua_lock() lua_ref(1) @@ -108,9 +128,14 @@ lua_Object lua_createtable (void); #define lua_pushliteral(o) lua_pushstring(o) -#define lua_getindexed(o,n) (lua_pushobject(o), lua_pushnumber(n), lua_getsubscript()) -#define lua_getfield(o,f) (lua_pushobject(o), lua_pushliteral(f), lua_getsubscript()) +#define lua_getindexed(o,n) (lua_pushobject(o), lua_pushnumber(n), lua_gettable()) +#define lua_getfield(o,f) (lua_pushobject(o), lua_pushstring(f), lua_gettable()) #define lua_copystring(o) (strdup(lua_getstring(o))) +#define lua_getsubscript lua_gettable +#define lua_storesubscript lua_settable + +#endif + #endif diff --git a/clients/lib/old/lualib.h b/include/lualib.h similarity index 53% rename from clients/lib/old/lualib.h rename to include/lualib.h index 6005d7c..38baf45 100644 --- a/clients/lib/old/lualib.h +++ b/include/lualib.h @@ -2,7 +2,7 @@ ** Libraries to be used in LUA programs ** Grupo de Tecnologia em Computacao Grafica ** TeCGraf - PUC-Rio -** $Id: lualib.h,v 1.8 1996/04/30 21:13:55 roberto Exp $ +** $Id: lualib.h,v 1.13 1997/03/26 22:23:15 roberto Exp $ */ #ifndef lualib_h @@ -15,19 +15,15 @@ void strlib_open (void); void mathlib_open (void); -/* auxiliar functions (private) */ -struct lua_reg { - char *name; - lua_CFunction func; -}; +/* auxiliar functions (private) */ -void luaI_openlib (struct lua_reg *l, int n); -void lua_arg_error(char *funcname); -char *lua_check_string (int numArg, char *funcname); -double lua_check_number (int numArg, char *funcname); char *luaI_addchar (int c); +void luaI_emptybuff (void); void luaI_addquoted (char *s); +char *luaL_item_end (char *p); +int luaL_singlematch (int c, char *p); + #endif diff --git a/src/Makefile b/src/Makefile index 1ac2ab8..9fe13c8 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,19 +4,23 @@ LUA= .. include $(LUA)/config -OBJS= fallback.o\ +OBJS= auxlib.o\ + fallback.o\ func.o\ hash.o\ inout.o\ lex.o\ - mem.o\ + luamem.o\ opcode.o\ parser.o\ table.o\ tree.o\ - undump.o + undump.o\ + zio.o -SRCS= fallback.c\ +SRCS= auxlib.c\ + auxlib.h\ + fallback.c\ fallback.h\ func.c\ func.h\ @@ -26,8 +30,8 @@ SRCS= fallback.c\ inout.h\ lex.c\ lex.h\ - mem.c\ - mem.h\ + luamem.c\ + luamem.h\ opcode.c\ opcode.h\ parser.c\ @@ -39,6 +43,8 @@ SRCS= fallback.c\ types.h\ undump.c\ undump.h\ + zio.c\ + zio.h\ lua.stx SLIB= $(LIB)/liblua.a diff --git a/src/auxlib.c b/src/auxlib.c new file mode 100644 index 0000000..e6f71f2 --- /dev/null +++ b/src/auxlib.c @@ -0,0 +1,81 @@ +char *rcs_auxlib="$Id: auxlib.c,v 1.5 1997/04/14 15:30:03 roberto Exp $"; + +#include +#include +#include + +#include "lua.h" +#include "auxlib.h" +#include "luadebug.h" + + + +int luaI_findstring (char *name, char *list[]) +{ + int i; + for (i=0; list[i]; i++) + if (strcmp(list[i], name) == 0) + return i; + return -1; /* name not found */ +} + + +void luaL_arg_check(int cond, int numarg, char *extramsg) +{ + if (!cond) { + char *funcname; + lua_getobjname(lua_stackedfunction(0), &funcname); + if (funcname == NULL) + funcname = "???"; + if (extramsg == NULL) + luaL_verror("bad argument #%d to function `%s'", numarg, funcname); + else + luaL_verror("bad argument #%d to function `%s' (%s)", + numarg, funcname, extramsg); + } +} + +char *luaL_check_string (int numArg) +{ + lua_Object o = lua_getparam(numArg); + luaL_arg_check(lua_isstring(o), numArg, "string expected"); + return lua_getstring(o); +} + +char *luaL_opt_string (int numArg, char *def) +{ + return (lua_getparam(numArg) == LUA_NOOBJECT) ? def : + luaL_check_string(numArg); +} + +double luaL_check_number (int numArg) +{ + lua_Object o = lua_getparam(numArg); + luaL_arg_check(lua_isnumber(o), numArg, "number expected"); + return lua_getnumber(o); +} + + +double luaL_opt_number (int numArg, double def) +{ + return (lua_getparam(numArg) == LUA_NOOBJECT) ? def : + luaL_check_number(numArg); +} + +void luaL_openlib (struct luaL_reg *l, int n) +{ + int i; + for (i=0; i #include -#include "mem.h" +#include "auxlib.h" +#include "luamem.h" #include "fallback.h" #include "opcode.h" #include "lua.h" #include "table.h" +#include "tree.h" +#include "hash.h" -static void errorFB (void); -static void indexFB (void); -static void gettableFB (void); -static void arithFB (void); -static void concatFB (void); -static void orderFB (void); -static void GDFB (void); -static void funcFB (void); - -/* -** Warning: This list must be in the same order as the #define's -*/ -struct FB luaI_fallBacks[] = { -{"error", {LUA_T_CFUNCTION, {errorFB}}, 1, 0}, -{"index", {LUA_T_CFUNCTION, {indexFB}}, 2, 1}, -{"gettable", {LUA_T_CFUNCTION, {gettableFB}}, 2, 1}, -{"arith", {LUA_T_CFUNCTION, {arithFB}}, 3, 1}, -{"order", {LUA_T_CFUNCTION, {orderFB}}, 3, 1}, -{"concat", {LUA_T_CFUNCTION, {concatFB}}, 2, 1}, -{"settable", {LUA_T_CFUNCTION, {gettableFB}}, 3, 0}, -{"gc", {LUA_T_CFUNCTION, {GDFB}}, 1, 0}, -{"function", {LUA_T_CFUNCTION, {funcFB}}, -1, -1}, - /* no fixed number of params or results */ -{"getglobal", {LUA_T_CFUNCTION, {indexFB}}, 1, 1} - /* same default behavior of index FB */ -}; - -#define N_FB (sizeof(luaI_fallBacks)/sizeof(struct FB)) - -void luaI_setfallback (void) -{ - int i; - char *name = lua_getstring(lua_getparam(1)); - lua_Object func = lua_getparam(2); - if (name == NULL || !lua_isfunction(func)) - lua_error("incorrect argument to function `setfallback'"); - for (i=0; i= 0 && ref < refSize && @@ -164,7 +71,7 @@ Object *luaI_getref (int ref) } -void luaI_travlock (int (*fn)(Object *)) +void luaI_travlock (int (*fn)(TObject *)) { int i; for (i=0; i= IMtable_size) { + luaI_initfallbacks(); + IMtable_size = growvector(&luaI_IMtable, IMtable_size, + struct IM, memEM, MAX_INT); + } + init_entry(last_tag); + return last_tag; +} + + +static void checktag (int tag) +{ + if (!(last_tag <= tag && tag <= 0)) + luaL_verror("%d is not a valid tag", tag); +} + +void luaI_realtag (int tag) +{ + if (!(last_tag <= tag && tag < LUA_T_NIL)) + luaL_verror("tag %d is not result of `newtag'", tag); +} + + +void luaI_settag (int tag, TObject *o) +{ + luaI_realtag(tag); + switch (ttype(o)) { + case LUA_T_ARRAY: + o->value.a->htag = tag; + break; + case LUA_T_USERDATA: + o->value.ts->tag = tag; + break; + default: + luaL_verror("cannot change the tag of a %s", luaI_typenames[-ttype(o)]); + } +} + + +int luaI_efectivetag (TObject *o) +{ + lua_Type t = ttype(o); + if (t == LUA_T_USERDATA) { + int tag = o->value.ts->tag; + return (tag >= 0) ? LUA_T_USERDATA : tag; + } + else if (t == LUA_T_ARRAY) + return o->value.a->htag; + else return t; +} + + +void luaI_gettagmethod (void) +{ + int t = (int)luaL_check_number(1); + int e = luaI_checkevent(luaL_check_string(2), luaI_eventname); + checktag(t); + if (validevent(t, e)) + luaI_pushobject(luaI_getim(t,e)); +} + + +void luaI_settagmethod (void) +{ + int t = (int)luaL_check_number(1); + int e = luaI_checkevent(luaL_check_string(2), luaI_eventname); + lua_Object func = lua_getparam(3); + checktag(t); + if (!validevent(t, e)) + luaL_verror("cannot change internal method `%s' for tag %d", + luaI_eventname[e], t); + luaL_arg_check(lua_isnil(func) || lua_isfunction(func), + 3, "function expected"); + luaI_pushobject(luaI_getim(t,e)); + *luaI_getim(t, e) = *luaI_Address(func); +} + + +static void stderrorim (void) +{ + lua_Object s = lua_getparam(1); + if (lua_isstring(s)) + fprintf(stderr, "lua: %s\n", lua_getstring(s)); +} + +static TObject errorim = {LUA_T_CFUNCTION, {stderrorim}}; + + +TObject *luaI_geterrorim (void) +{ + return &errorim; +} + +void luaI_seterrormethod (void) +{ + lua_Object func = lua_getparam(1); + luaL_arg_check(lua_isnil(func) || lua_isfunction(func), + 1, "function expected"); + luaI_pushobject(&errorim); + errorim = *luaI_Address(func); +} + +char *luaI_travfallbacks (int (*fn)(TObject *)) +{ + int e; + if (fn(&errorim)) + return "error"; + for (e=IM_GETTABLE; e<=IM_FUNCTION; e++) { /* ORDER IM */ + int t; + for (t=0; t>=last_tag; t--) + if (fn(luaI_getim(t,e))) + return luaI_eventname[e]; + } return NULL; } + + +/* +* =================================================================== +* compatibility with old fallback system +*/ +#if LUA_COMPAT2_5 + +static void errorFB (void) +{ + lua_Object o = lua_getparam(1); + if (lua_isstring(o)) + fprintf (stderr, "lua: %s\n", lua_getstring(o)); + else + fprintf(stderr, "lua: unknown error\n"); +} + + +static void nilFB (void) { } + + +static void typeFB (void) +{ + lua_error("unexpected type"); +} + + +static void fillvalids (IMS e, TObject *func) +{ + int t; + for (t=LUA_T_NIL; t<=LUA_T_USERDATA; t++) + if (validevent(t, e)) + *luaI_getim(t, e) = *func; +} + + +void luaI_setfallback (void) +{ + static char *oldnames [] = {"error", "getglobal", "arith", "order", NULL}; + TObject oldfunc; + lua_CFunction replace; + char *name = luaL_check_string(1); + lua_Object func = lua_getparam(2); + luaI_initfallbacks(); + luaL_arg_check(lua_isfunction(func), 2, "function expected"); + switch (luaI_findstring(name, oldnames)) { + case 0: /* old error fallback */ + oldfunc = errorim; + errorim = *luaI_Address(func); + replace = errorFB; + break; + case 1: /* old getglobal fallback */ + oldfunc = *luaI_getim(LUA_T_NIL, IM_GETGLOBAL); + *luaI_getim(LUA_T_NIL, IM_GETGLOBAL) = *luaI_Address(func); + replace = nilFB; + break; + case 2: { /* old arith fallback */ + int i; + oldfunc = *luaI_getim(LUA_T_NUMBER, IM_POW); + for (i=IM_ADD; i<=IM_UNM; i++) /* ORDER IM */ + fillvalids(i, luaI_Address(func)); + replace = typeFB; + break; + } + case 3: { /* old order fallback */ + int i; + oldfunc = *luaI_getim(LUA_T_LINE, IM_LT); + for (i=IM_LT; i<=IM_GE; i++) /* ORDER IM */ + fillvalids(i, luaI_Address(func)); + replace = typeFB; + break; + } + default: { + int e; + if ((e = luaI_findstring(name, luaI_eventname)) >= 0) { + oldfunc = *luaI_getim(LUA_T_LINE, e); + fillvalids(e, luaI_Address(func)); + replace = (e == IM_GC || e == IM_INDEX) ? nilFB : typeFB; + } + else { + luaL_verror("`%s' is not a valid fallback name", name); + replace = NULL; /* to avoid warnings */ + } + } + } + if (oldfunc.ttype != LUA_T_NIL) + luaI_pushobject(&oldfunc); + else + lua_pushcfunction(replace); +} +#endif diff --git a/src/fallback.h b/src/fallback.h dissimilarity index 77% index 71f150f..7e314c9 100644 --- a/src/fallback.h +++ b/src/fallback.h @@ -1,37 +1,65 @@ -/* -** $Id: fallback.h,v 1.13 1996/04/25 14:10:00 roberto Exp $ -*/ - -#ifndef fallback_h -#define fallback_h - -#include "lua.h" -#include "opcode.h" - -extern struct FB { - char *kind; - Object function; - int nParams; - int nResults; -} luaI_fallBacks[]; - -#define FB_ERROR 0 -#define FB_INDEX 1 -#define FB_GETTABLE 2 -#define FB_ARITH 3 -#define FB_ORDER 4 -#define FB_CONCAT 5 -#define FB_SETTABLE 6 -#define FB_GC 7 -#define FB_FUNCTION 8 -#define FB_GETGLOBAL 9 - -void luaI_setfallback (void); -int luaI_ref (Object *object, int lock); -Object *luaI_getref (int ref); -void luaI_travlock (int (*fn)(Object *)); -void luaI_invalidaterefs (void); -char *luaI_travfallbacks (int (*fn)(Object *)); - -#endif - +/* +** $Id: fallback.h,v 1.23 1997/04/24 22:59:57 roberto Exp $ +*/ + +#ifndef fallback_h +#define fallback_h + +#include "lua.h" +#include "opcode.h" + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER IM" +*/ +typedef enum { + IM_GETTABLE = 0, + IM_SETTABLE, + IM_INDEX, + IM_GETGLOBAL, + IM_SETGLOBAL, + IM_ADD, + IM_SUB, + IM_MUL, + IM_DIV, + IM_POW, + IM_UNM, + IM_LT, + IM_LE, + IM_GT, + IM_GE, + IM_CONCAT, + IM_GC, + IM_FUNCTION +} IMS; + +#define IM_N 18 + + +extern struct IM { + TObject int_method[IM_N]; +} *luaI_IMtable; + +extern char *luaI_eventname[]; + +#define luaI_getim(tag,event) (&luaI_IMtable[-(tag)].int_method[event]) +#define luaI_getimbyObj(o,e) (luaI_getim(luaI_efectivetag(o),(e))) + +void luaI_setfallback (void); +int luaI_ref (TObject *object, int lock); +TObject *luaI_getref (int ref); +void luaI_travlock (int (*fn)(TObject *)); +void luaI_invalidaterefs (void); +char *luaI_travfallbacks (int (*fn)(TObject *)); + +void luaI_settag (int tag, TObject *o); +void luaI_realtag (int tag); +TObject *luaI_geterrorim (void); +int luaI_efectivetag (TObject *o); +void luaI_settagmethod (void); +void luaI_gettagmethod (void); +void luaI_seterrormethod (void); +void luaI_initfallbacks (void); + +#endif + diff --git a/src/func.c b/src/func.c index 0e15c2f..36f7e19 100644 --- a/src/func.c +++ b/src/func.c @@ -2,9 +2,10 @@ #include "luadebug.h" #include "table.h" -#include "mem.h" +#include "luamem.h" #include "func.h" #include "opcode.h" +#include "inout.h" static TFunc *function_root = NULL; @@ -23,7 +24,7 @@ void luaI_initTFunc (TFunc *f) f->size = 0; f->code = NULL; f->lineDefined = 0; - f->fileName = NULL; + f->fileName = lua_parsedfile; f->locvars = NULL; } @@ -49,47 +50,56 @@ void luaI_freefunc (TFunc *f) luaI_free (f); } + +void luaI_funcfree (TFunc *l) +{ + while (l) { + TFunc *next = l->next; + luaI_freefunc(l); + l = next; + } +} + /* ** Garbage collection function. -** This function traverse the function list freeing unindexed functions */ -Long luaI_funccollector (void) +TFunc *luaI_funccollector (long *acum) { TFunc *curr = function_root; TFunc *prev = NULL; - Long counter = 0; - while (curr) - { + TFunc *frees = NULL; + long counter = 0; + while (curr) { TFunc *next = curr->next; - if (!curr->marked) - { + if (!curr->marked) { if (prev == NULL) function_root = next; else prev->next = next; - luaI_freefunc (curr); + curr->next = frees; + frees = curr; ++counter; } - else - { + else { curr->marked = 0; prev = curr; } curr = next; } - return counter; + *acum += counter; + return frees; } void lua_funcinfo (lua_Object func, char **filename, int *linedefined) { - Object *f = luaI_Address(func); - if (f->tag == LUA_T_MARK || f->tag == LUA_T_FUNCTION) + TObject *f = luaI_Address(func); + if (f->ttype == LUA_T_MARK || f->ttype == LUA_T_FUNCTION) { *filename = f->value.tf->fileName; *linedefined = f->value.tf->lineDefined; } - else if (f->tag == LUA_T_CMARK || f->tag == LUA_T_CFUNCTION) + else if (f->ttype == LUA_T_CMARK || f->ttype == LUA_T_CFUNCTION) { *filename = "(C)"; *linedefined = -1; diff --git a/src/func.h b/src/func.h index 2ee1210..c79bbb7 100644 --- a/src/func.h +++ b/src/func.h @@ -1,5 +1,5 @@ /* -** $Id: func.h,v 1.8 1996/03/14 15:54:20 roberto Exp $ +** $Id: func.h,v 1.9 1997/05/14 18:38:29 roberto Exp $ */ #ifndef func_h @@ -30,7 +30,8 @@ typedef struct TFunc LocVar *locvars; } TFunc; -Long luaI_funccollector (void); +TFunc *luaI_funccollector (long *cont); +void luaI_funcfree (TFunc *l); void luaI_insertfunction (TFunc *f); void luaI_initTFunc (TFunc *f); diff --git a/src/hash.c b/src/hash.c index 19ae7b1..b927602 100644 --- a/src/hash.c +++ b/src/hash.c @@ -3,14 +3,15 @@ ** hash manager for lua */ -char *rcs_hash="$Id: hash.c,v 2.32 1996/11/18 13:48:44 roberto Exp $"; +char *rcs_hash="$Id: hash.c,v 2.43 1997/05/14 18:38:29 roberto Exp $"; -#include "mem.h" +#include "luamem.h" #include "opcode.h" #include "hash.h" #include "table.h" #include "lua.h" +#include "auxlib.h" #define nhash(t) ((t)->nhash) @@ -24,13 +25,15 @@ char *rcs_hash="$Id: hash.c,v 2.32 1996/11/18 13:48:44 roberto Exp $"; #define REHASH_LIMIT 0.70 /* avoid more than this % full */ +#define TagDefault LUA_T_ARRAY; + static Hash *listhead = NULL; /* hash dimensions values */ static Long dimensions[] = - {3L, 5L, 7L, 11L, 23L, 47L, 97L, 197L, 397L, 797L, 1597L, 3203L, 6421L, + {5L, 11L, 23L, 47L, 97L, 197L, 397L, 797L, 1597L, 3203L, 6421L, 12853L, 25717L, 51437L, 102811L, 205619L, 411233L, 822433L, 1644817L, 3289613L, 6579211L, 13158023L, MAX_INT}; @@ -46,16 +49,32 @@ int luaI_redimension (int nhash) return 0; /* to avoid warnings */ } -static int hashindex (Hash *t, Object *ref) /* hash function */ + +int lua_equalObj (TObject *t1, TObject *t2) +{ + if (ttype(t1) != ttype(t2)) return 0; + switch (ttype(t1)) + { + case LUA_T_NIL: return 1; + case LUA_T_NUMBER: return nvalue(t1) == nvalue(t2); + case LUA_T_STRING: case LUA_T_USERDATA: return svalue(t1) == svalue(t2); + case LUA_T_ARRAY: return avalue(t1) == avalue(t2); + case LUA_T_FUNCTION: return t1->value.tf == t2->value.tf; + case LUA_T_CFUNCTION: return fvalue(t1) == fvalue(t2); + default: + lua_error("internal error in `lua_equalObj'"); + return 0; /* UNREACHEABLE */ + } +} + + +static long int hashindex (TObject *ref) { long int h; - switch (tag(ref)) { - case LUA_T_NIL: - lua_error ("unexpected type to index table"); - h = 0; /* UNREACHEABLE */ + switch (ttype(ref)) { case LUA_T_NUMBER: h = (long int)nvalue(ref); break; - case LUA_T_STRING: + case LUA_T_STRING: case LUA_T_USERDATA: h = tsvalue(ref)->hash; break; case LUA_T_FUNCTION: h = (IntPoint)ref->value.tf; break; @@ -63,38 +82,29 @@ static int hashindex (Hash *t, Object *ref) /* hash function */ h = (IntPoint)fvalue(ref); break; case LUA_T_ARRAY: h = (IntPoint)avalue(ref); break; - default: /* user data */ - h = (IntPoint)uvalue(ref); break; + default: + lua_error ("unexpected type to index table"); + h = 0; /* UNREACHEABLE */ } if (h < 0) h = -h; - return h%nhash(t); /* make it a valid index */ + return h; } -int lua_equalObj (Object *t1, Object *t2) + +static int present (Hash *t, TObject *key) { - if (tag(t1) != tag(t2)) return 0; - switch (tag(t1)) - { - case LUA_T_NIL: return 1; - case LUA_T_NUMBER: return nvalue(t1) == nvalue(t2); - case LUA_T_STRING: return svalue(t1) == svalue(t2); - case LUA_T_ARRAY: return avalue(t1) == avalue(t2); - case LUA_T_FUNCTION: return t1->value.tf == t2->value.tf; - case LUA_T_CFUNCTION: return fvalue(t1) == fvalue(t2); - default: return uvalue(t1) == uvalue(t2); + long int h = hashindex(key); + int tsize = nhash(t); + int h1 = h%tsize; + TObject *rf = ref(node(t, h1)); + if (ttype(rf) != LUA_T_NIL && !lua_equalObj(key, rf)) { + int h2 = h%(tsize-2) + 1; + do { + h1 = (h1+h2)%tsize; + rf = ref(node(t, h1)); + } while (ttype(rf) != LUA_T_NIL && !lua_equalObj(key, rf)); } -} - -static int present (Hash *t, Object *ref) -{ - int h = hashindex(t, ref); - while (tag(ref(node(t, h))) != LUA_T_NIL) - { - if (lua_equalObj(ref, ref(node(t, h)))) - return h; - h = (h+1) % nhash(t); - } - return h; + return h1; } @@ -106,7 +116,7 @@ static Node *hashnodecreate (int nhash) int i; Node *v = newvector (nhash, Node); for (i=0; ihtag = TagDefault; return t; } @@ -146,7 +157,7 @@ void lua_hashmark (Hash *h) for (i=0; iref); lua_markobject(&n->val); @@ -156,49 +167,50 @@ void lua_hashmark (Hash *h) } -static void call_fallbacks (void) +void luaI_hashcallIM (Hash *l) { - Hash *curr_array; - Object t; - tag(&t) = LUA_T_ARRAY; - for (curr_array = listhead; curr_array; curr_array = curr_array->next) - if (markarray(curr_array) != 1) - { - avalue(&t) = curr_array; - luaI_gcFB(&t); - } - tag(&t) = LUA_T_NIL; - luaI_gcFB(&t); /* end of list */ + TObject t; + ttype(&t) = LUA_T_ARRAY; + for (; l; l=l->next) { + avalue(&t) = l; + luaI_gcIM(&t); + } } - -/* -** Garbage collection to arrays -** Delete all unmarked arrays. -*/ -Long lua_hashcollector (void) + +void luaI_hashfree (Hash *frees) { - Hash *curr_array = listhead, *prev = NULL; - Long counter = 0; - call_fallbacks(); - while (curr_array != NULL) - { - Hash *next = curr_array->next; - if (markarray(curr_array) != 1) - { - if (prev == NULL) listhead = next; - else prev->next = next; - hashdelete(curr_array); - ++counter; + while (frees) { + Hash *next = frees->next; + hashdelete(frees); + frees = next; } - else - { - markarray(curr_array) = 0; - prev = curr_array; +} + + +Hash *luaI_hashcollector (long *acum) +{ + Hash *curr_array = listhead, *prev = NULL, *frees = NULL; + long counter = 0; + while (curr_array != NULL) { + Hash *next = curr_array->next; + if (markarray(curr_array) != 1) { + if (prev == NULL) + listhead = next; + else + prev->next = next; + curr_array->next = frees; + frees = curr_array; + ++counter; + } + else { + markarray(curr_array) = 0; + prev = curr_array; + } + curr_array = next; } - curr_array = next; - } - return counter; + *acum += counter; + return frees; } @@ -220,32 +232,45 @@ Hash *lua_createarray (int nhash) /* -** Re-hash +** Rehash: +** Check if table has deleted slots. It it has, it does not need to +** grow, since rehash will reuse them. */ +static int emptyslots (Hash *t) +{ + int i; + for (i=nhash(t)-1; i>=0; i--) { + Node *n = node(t, i); + if (ttype(ref(n)) != LUA_T_NIL && ttype(val(n)) == LUA_T_NIL) + return 1; + } + return 0; +} + static void rehash (Hash *t) { - int i; - int nold = nhash(t); - Node *vold = nodevector(t); - nhash(t) = luaI_redimension(nhash(t)); - nodevector(t) = hashnodecreate(nhash(t)); - for (i=0; i (float)nhash(t)*REHASH_LIMIT) - { - rehash(t); - h = present(t, ref); - n = node(t, h); + Node *n = node(t, present(t, ref)); + if (ttype(ref(n)) == LUA_T_NIL) { + nuse(t)++; + if ((float)nuse(t) > (float)nhash(t)*REHASH_LIMIT) { + rehash(t); + n = node(t, present(t, ref)); + } + *ref(n) = *ref; + ttype(val(n)) = LUA_T_NIL; } - *ref(n) = *ref; - tag(val(n)) = LUA_T_NIL; - } - return (val(n)); + return (val(n)); } @@ -284,36 +303,30 @@ Object *lua_hashdefine (Hash *t, Object *ref) */ static void hashnext (Hash *t, int i) { - if (i >= nhash(t)) - return; - while (tag(ref(node(t,i))) == LUA_T_NIL || tag(val(node(t,i))) == LUA_T_NIL) - { - if (++i >= nhash(t)) - return; - } - luaI_pushobject(ref(node(t,i))); - luaI_pushobject(val(node(t,i))); + Node *n; + int tsize = nhash(t); + if (i >= tsize) + return; + n = node(t, i); + while (ttype(ref(n)) == LUA_T_NIL || ttype(val(n)) == LUA_T_NIL) { + if (++i >= tsize) + return; + n = node(t, i); + } + luaI_pushobject(ref(node(t,i))); + luaI_pushobject(val(node(t,i))); } void lua_next (void) { - Hash *t; - lua_Object o = lua_getparam(1); - lua_Object r = lua_getparam(2); - if (o == LUA_NOOBJECT || r == LUA_NOOBJECT) - lua_error ("too few arguments to function `next'"); - if (lua_getparam(3) != LUA_NOOBJECT) - lua_error ("too many arguments to function `next'"); - if (!lua_istable(o)) - lua_error ("first argument of function `next' is not a table"); - t = avalue(luaI_Address(o)); - if (lua_isnil(r)) - { - hashnext(t, 0); - } - else - { - int h = present (t, luaI_Address(r)); - hashnext(t, h+1); - } + Hash *t; + lua_Object o = lua_getparam(1); + lua_Object r = lua_getparam(2); + luaL_arg_check(lua_istable(o), 1, "table expected"); + luaL_arg_check(r != LUA_NOOBJECT, 2, "value expected"); + t = avalue(luaI_Address(o)); + if (lua_isnil(r)) + hashnext(t, 0); + else + hashnext(t, present(t, luaI_Address(r))+1); } diff --git a/src/hash.h b/src/hash.h index c2b5201..1bc758b 100644 --- a/src/hash.h +++ b/src/hash.h @@ -1,7 +1,7 @@ /* ** hash.h ** hash manager for lua -** $Id: hash.h,v 2.12 1996/05/06 14:30:27 roberto Exp $ +** $Id: hash.h,v 2.16 1997/05/14 18:38:29 roberto Exp $ */ #ifndef hash_h @@ -10,29 +10,30 @@ #include "types.h" #include "opcode.h" -typedef struct node -{ - Object ref; - Object val; +typedef struct node { + TObject ref; + TObject val; } Node; -typedef struct Hash -{ - struct Hash *next; - Node *node; - int nhash; - int nuse; - char mark; +typedef struct Hash { + struct Hash *next; + Node *node; + int nhash; + int nuse; + int htag; + char mark; } Hash; -int lua_equalObj (Object *t1, Object *t2); +int lua_equalObj (TObject *t1, TObject *t2); int luaI_redimension (int nhash); Hash *lua_createarray (int nhash); void lua_hashmark (Hash *h); -Long lua_hashcollector (void); -Object *lua_hashget (Hash *t, Object *ref); -Object *lua_hashdefine (Hash *t, Object *ref); +Hash *luaI_hashcollector (long *count); +void luaI_hashcallIM (Hash *l); +void luaI_hashfree (Hash *frees); +TObject *lua_hashget (Hash *t, TObject *ref); +TObject *lua_hashdefine (Hash *t, TObject *ref); void lua_next (void); #endif diff --git a/src/inout.c b/src/inout.c dissimilarity index 66% index 0aa551c..5d71061 100644 --- a/src/inout.c +++ b/src/inout.c @@ -1,300 +1,408 @@ -/* -** inout.c -** Provide function to realise the input/output function and debugger -** facilities. -** Also provides some predefined lua functions. -*/ - -char *rcs_inout="$Id: inout.c,v 2.43 1996/09/25 12:57:22 roberto Exp $"; - -#include -#include - -#include "lex.h" -#include "opcode.h" -#include "inout.h" -#include "table.h" -#include "tree.h" -#include "lua.h" -#include "mem.h" - - -/* Exported variables */ -Word lua_linenumber; -char *lua_parsedfile; - - -static FILE *fp; -static char *st; - -/* -** Function to get the next character from the input file -*/ -static int fileinput (void) -{ - int c = fgetc(fp); - return (c == EOF) ? 0 : c; -} - -/* -** Function to get the next character from the input string -*/ -static int stringinput (void) -{ - return *st++; -} - -/* -** Function to open a file to be input unit. -** Return the file. -*/ -FILE *lua_openfile (char *fn) -{ - lua_setinput (fileinput); - if (fn == NULL) - { - fp = stdin; - fn = "(stdin)"; - } - else - fp = fopen (fn, "r"); - if (fp == NULL) - return NULL; - lua_parsedfile = luaI_createfixedstring(fn)->str; - return fp; -} - -/* -** Function to close an opened file -*/ -void lua_closefile (void) -{ - if (fp != NULL && fp != stdin) - { - fclose (fp); - fp = NULL; - } -} - -/* -** Function to open a string to be input unit -*/ -#define SIZE_PREF 20 /* size of string prefix to appear in error messages */ -void lua_openstring (char *s) -{ - char buff[SIZE_PREF+25]; - lua_setinput(stringinput); - st = s; - strcpy(buff, "(dostring) >> "); - strncat(buff, s, SIZE_PREF); - if (strlen(s) > SIZE_PREF) strcat(buff, "..."); - lua_parsedfile = luaI_createfixedstring(buff)->str; -} - -/* -** Function to close an opened string -*/ -void lua_closestring (void) -{ -} - - -static void check_arg (int cond, char *func) -{ - if (!cond) - { - char buff[100]; - sprintf(buff, "incorrect argument to function `%s'", func); - lua_error(buff); - } -} - - -static int passresults (void) -{ - int arg = 0; - lua_Object obj; - while ((obj = lua_getresult(++arg)) != LUA_NOOBJECT) - lua_pushobject(obj); - return arg-1; -} - -/* -** Internal function: do a string -*/ -void lua_internaldostring (void) -{ - lua_Object obj = lua_getparam (1); - if (lua_isstring(obj) && lua_dostring(lua_getstring(obj)) == 0) - if (passresults() == 0) - lua_pushuserdata(NULL); /* at least one result to signal no errors */ -} - -/* -** Internal function: do a file -*/ -void lua_internaldofile (void) -{ - lua_Object obj = lua_getparam (1); - char *fname = NULL; - if (lua_isstring(obj)) - fname = lua_getstring(obj); - else if (obj != LUA_NOOBJECT) - lua_error("invalid argument to function `dofile'"); - /* else fname = NULL */ - if (lua_dofile(fname) == 0) - if (passresults() == 0) - lua_pushuserdata(NULL); /* at least one result to signal no errors */ -} - - -static char *tostring (lua_Object obj) -{ - char *buff = luaI_buffer(20); - if (lua_isstring(obj)) /* get strings and numbers */ - return lua_getstring(obj); - else switch(lua_type(obj)) - { - case LUA_T_FUNCTION: - sprintf(buff, "function: %p", (luaI_Address(obj))->value.tf); - break; - case LUA_T_CFUNCTION: - sprintf(buff, "cfunction: %p", lua_getcfunction(obj)); - break; - case LUA_T_ARRAY: - sprintf(buff, "table: %p", avalue(luaI_Address(obj))); - break; - case LUA_T_NIL: - sprintf(buff, "nil"); - break; - default: - sprintf(buff, "userdata: %p", lua_getuserdata(obj)); - break; - } - return buff; -} - -void luaI_tostring (void) -{ - lua_pushstring(tostring(lua_getparam(1))); -} - -void luaI_print (void) -{ - int i = 1; - lua_Object obj; - while ((obj = lua_getparam(i++)) != LUA_NOOBJECT) - printf("%s\n", tostring(obj)); -} - -/* -** Internal function: return an object type. -*/ -void luaI_type (void) -{ - lua_Object o = lua_getparam(1); - int t; - if (o == LUA_NOOBJECT) - lua_error("no parameter to function 'type'"); - t = lua_type(o); - switch (t) - { - case LUA_T_NIL : - lua_pushliteral("nil"); - break; - case LUA_T_NUMBER : - lua_pushliteral("number"); - break; - case LUA_T_STRING : - lua_pushliteral("string"); - break; - case LUA_T_ARRAY : - lua_pushliteral("table"); - break; - case LUA_T_FUNCTION : - case LUA_T_CFUNCTION : - lua_pushliteral("function"); - break; - default : - lua_pushliteral("userdata"); - break; - } - lua_pushnumber(t); -} - -/* -** Internal function: convert an object to a number -*/ -void lua_obj2number (void) -{ - lua_Object o = lua_getparam(1); - if (lua_isnumber(o)) - lua_pushnumber(lua_getnumber(o)); -} - - -void luaI_error (void) -{ - char *s = lua_getstring(lua_getparam(1)); - if (s == NULL) s = "(no message)"; - lua_error(s); -} - -void luaI_assert (void) -{ - lua_Object p = lua_getparam(1); - if (p == LUA_NOOBJECT || lua_isnil(p)) - lua_error("assertion failed!"); -} - -void luaI_setglobal (void) -{ - lua_Object name = lua_getparam(1); - lua_Object value = lua_getparam(2); - check_arg(lua_isstring(name), "setglobal"); - lua_pushobject(value); - lua_storeglobal(lua_getstring(name)); - lua_pushobject(value); /* return given value */ -} - -void luaI_getglobal (void) -{ - lua_Object name = lua_getparam(1); - check_arg(lua_isstring(name), "getglobal"); - lua_pushobject(lua_getglobal(lua_getstring(name))); -} - -#define MAXPARAMS 256 -void luaI_call (void) -{ - lua_Object f = lua_getparam(1); - lua_Object arg = lua_getparam(2); - lua_Object temp, params[MAXPARAMS]; - int narg, i; - check_arg(lua_istable(arg), "call"); - check_arg(lua_isfunction(f), "call"); - /* narg = arg.n */ - lua_pushobject(arg); - lua_pushstring("n"); - temp = lua_getsubscript(); - narg = lua_isnumber(temp) ? lua_getnumber(temp) : MAXPARAMS+1; - /* read arg[1...n] */ - for (i=0; i=MAXPARAMS) - lua_error("argument list too long in function `call'"); - lua_pushobject(arg); - lua_pushnumber(i+1); - params[i] = lua_getsubscript(); - if (narg == MAXPARAMS+1 && lua_isnil(params[i])) { - narg = i; - break; - } - } - /* push parameters and do the call */ - for (i=0; i +#include + +#include "auxlib.h" +#include "fallback.h" +#include "hash.h" +#include "inout.h" +#include "lex.h" +#include "lua.h" +#include "luamem.h" +#include "luamem.h" +#include "opcode.h" +#include "table.h" +#include "tree.h" +#include "undump.h" +#include "zio.h" + + +/* Exported variables */ +Word lua_linenumber; +char *lua_parsedfile; + + +char *luaI_typenames[] = { /* ORDER LUA_T */ + "userdata", "line", "cmark", "mark", "function", + "function", "table", "string", "number", "nil", + NULL +}; + + + +void luaI_setparsedfile (char *name) +{ + lua_parsedfile = luaI_createfixedstring(name)->str; +} + + +int lua_doFILE (FILE *f, int bin) +{ + ZIO z; + luaZ_Fopen(&z, f); + if (bin) + return luaI_undump(&z); + else { + lua_setinput(&z); + return lua_domain(); + } +} + + +int lua_dofile (char *filename) +{ + int status; + int c; + FILE *f = (filename == NULL) ? stdin : fopen(filename, "r"); + if (f == NULL) + return 2; + luaI_setparsedfile(filename?filename:"(stdin)"); + c = fgetc(f); + ungetc(c, f); + if (c == ID_CHUNK) { + f = freopen(filename, "rb", f); /* set binary mode */ + status = lua_doFILE(f, 1); + } + else { + if (c == '#') + while ((c=fgetc(f)) != '\n') /* skip first line */; + status = lua_doFILE(f, 0); + } + if (f != stdin) + fclose(f); + return status; +} + + + +#define SIZE_PREF 20 /* size of string prefix to appear in error messages */ + + +int lua_dobuffer (char *buff, int size) +{ + int status; + ZIO z; + luaI_setparsedfile("(buffer)"); + luaZ_mopen(&z, buff, size); + status = luaI_undump(&z); + return status; +} + + +int lua_dostring (char *str) +{ + int status; + char buff[SIZE_PREF+25]; + char *temp; + ZIO z; + if (str == NULL) return 1; + sprintf(buff, "(dostring) >> %.20s", str); + temp = strchr(buff, '\n'); + if (temp) *temp = 0; /* end string after first line */ + luaI_setparsedfile(buff); + luaZ_sopen(&z, str); + lua_setinput(&z); + status = lua_domain(); + return status; +} + + + + +static int passresults (void) +{ + int arg = 0; + lua_Object obj; + while ((obj = lua_getresult(++arg)) != LUA_NOOBJECT) + lua_pushobject(obj); + return arg-1; +} + + +static void packresults (void) +{ + int arg = 0; + lua_Object obj; + lua_Object table = lua_createtable(); + while ((obj = lua_getresult(++arg)) != LUA_NOOBJECT) { + lua_pushobject(table); + lua_pushnumber(arg); + lua_pushobject(obj); + lua_rawsettable(); + } + lua_pushobject(table); + lua_pushstring("n"); + lua_pushnumber(arg-1); + lua_rawsettable(); + lua_pushobject(table); /* final result */ +} + +/* +** Internal function: do a string +*/ +static void lua_internaldostring (void) +{ + lua_Object err = lua_getparam(2); + if (err != LUA_NOOBJECT) { /* set new error method */ + luaL_arg_check(lua_isnil(err) || lua_isfunction(err), 2, + "must be a valid error handler"); + lua_pushobject(err); + err = lua_seterrormethod(); + } + if (lua_dostring(luaL_check_string(1)) == 0) + if (passresults() == 0) + lua_pushuserdata(NULL); /* at least one result to signal no errors */ + if (err != LUA_NOOBJECT) { /* restore old error method */ + lua_pushobject(err); + lua_seterrormethod(); + } +} + +/* +** Internal function: do a file +*/ +static void lua_internaldofile (void) +{ + char *fname = luaL_opt_string(1, NULL); + if (lua_dofile(fname) == 0) + if (passresults() == 0) + lua_pushuserdata(NULL); /* at least one result to signal no errors */ +} + + +static char *tostring (lua_Object obj) +{ + TObject *o = luaI_Address(obj); + switch (ttype(o)) { + case LUA_T_NUMBER: case LUA_T_STRING: + return lua_getstring(obj); + case LUA_T_ARRAY: case LUA_T_FUNCTION: + case LUA_T_CFUNCTION: case LUA_T_NIL: + return luaI_typenames[-ttype(o)]; + case LUA_T_USERDATA: { + char *buff = luaI_buffer(30); + sprintf(buff, "userdata: %p", o->value.ts->u.v); + return buff; + } + default: return ""; + } +} + +static void luaI_tostring (void) +{ + lua_pushstring(tostring(lua_getparam(1))); +} + +static void luaI_print (void) +{ + int i = 1; + lua_Object obj; + while ((obj = lua_getparam(i++)) != LUA_NOOBJECT) + printf("%s\n", tostring(obj)); +} + +static void luaI_type (void) +{ + lua_Object o = lua_getparam(1); + luaL_arg_check(o != LUA_NOOBJECT, 1, "no argument"); + lua_pushstring(luaI_typenames[-ttype(luaI_Address(o))]); + lua_pushnumber(lua_tag(o)); +} + +/* +** Internal function: convert an object to a number +*/ +static void lua_obj2number (void) +{ + lua_Object o = lua_getparam(1); + if (lua_isnumber(o)) + lua_pushnumber(lua_getnumber(o)); +} + + +static void luaI_error (void) +{ + char *s = lua_getstring(lua_getparam(1)); + if (s == NULL) s = "(no message)"; + lua_error(s); +} + +static void luaI_assert (void) +{ + lua_Object p = lua_getparam(1); + if (p == LUA_NOOBJECT || lua_isnil(p)) + lua_error("assertion failed!"); +} + +static void luaI_setglobal (void) +{ + lua_Object value = lua_getparam(2); + luaL_arg_check(value != LUA_NOOBJECT, 2, NULL); + lua_pushobject(value); + lua_setglobal(luaL_check_string(1)); + lua_pushobject(value); /* return given value */ +} + +static void luaI_rawsetglobal (void) +{ + lua_Object value = lua_getparam(2); + luaL_arg_check(value != LUA_NOOBJECT, 2, NULL); + lua_pushobject(value); + lua_rawsetglobal(luaL_check_string(1)); + lua_pushobject(value); /* return given value */ +} + +static void luaI_getglobal (void) +{ + lua_pushobject(lua_getglobal(luaL_check_string(1))); +} + +static void luaI_rawgetglobal (void) +{ + lua_pushobject(lua_rawgetglobal(luaL_check_string(1))); +} + +static void luatag (void) +{ + lua_pushnumber(lua_tag(lua_getparam(1))); +} + + +static int getnarg (lua_Object table) +{ + lua_Object temp; + /* temp = table.n */ + lua_pushobject(table); lua_pushstring("n"); temp = lua_gettable(); + return (lua_isnumber(temp) ? lua_getnumber(temp) : MAX_WORD); +} + +static void luaI_call (void) +{ + lua_Object f = lua_getparam(1); + lua_Object arg = lua_getparam(2); + int withtable = (strcmp(luaL_opt_string(3, ""), "pack") == 0); + int narg, i; + luaL_arg_check(lua_isfunction(f), 1, "function expected"); + luaL_arg_check(lua_istable(arg), 2, "table expected"); + narg = getnarg(arg); + /* push arg[1...n] */ + for (i=0; i - - -extern Word lua_linenumber; -extern Word lua_debugline; -extern char *lua_parsedfile; - -FILE *lua_openfile (char *fn); -void lua_closefile (void); -void lua_openstring (char *s); -void lua_closestring (void); - -void lua_internaldofile (void); -void lua_internaldostring (void); -void luaI_tostring (void); -void luaI_print (void); -void luaI_type (void); -void lua_obj2number (void); -void luaI_error (void); -void luaI_assert (void); -void luaI_setglobal (void); -void luaI_getglobal (void); -void luaI_call (void); - -#endif +/* +** $Id: inout.h,v 1.20 1997/06/19 18:04:34 roberto Exp $ +*/ + + +#ifndef inout_h +#define inout_h + +#include "types.h" +#include + + +extern Word lua_linenumber; +extern Word lua_debugline; +extern char *lua_parsedfile; + +void luaI_setparsedfile (char *name); + +void luaI_predefine (void); + +int lua_dobuffer (char *buff, int size); +int lua_doFILE (FILE *f, int bin); + + +#endif diff --git a/src/lex.c b/src/lex.c index bd3233a..5f19dd0 100644 --- a/src/lex.c +++ b/src/lex.c @@ -1,10 +1,11 @@ -char *rcs_lex = "$Id: lex.c,v 2.39 1996/11/08 19:08:30 roberto Exp $"; +char *rcs_lex = "$Id: lex.c,v 3.5 1997/06/16 16:50:22 roberto Exp $"; #include #include -#include "mem.h" +#include "auxlib.h" +#include "luamem.h" #include "tree.h" #include "table.h" #include "lex.h" @@ -12,33 +13,58 @@ char *rcs_lex = "$Id: lex.c,v 2.39 1996/11/08 19:08:30 roberto Exp $"; #include "luadebug.h" #include "parser.h" -#define MINBUFF 260 +#define MINBUFF 250 -#define next() (current = input()) +static int current; /* look ahead character */ +static ZIO *lex_z; + + +#define next() (current = zgetc(lex_z)) #define save(x) (yytext[tokensize++] = (x)) #define save_and_next() (save(current), next()) -static int current; /* look ahead character */ -static Input input; /* input function */ +#define MAX_IFS 5 + +/* "ifstate" keeps the state of each nested $if the lexical is dealing with. */ + +static struct { + int elsepart; /* true if its in the $else part */ + int condition; /* true if $if condition is true */ + int skip; /* true if part must be skiped */ +} ifstate[MAX_IFS]; + +static int iflevel; /* level of nested $if's */ -void lua_setinput (Input fn) +void lua_setinput (ZIO *z) { current = '\n'; lua_linenumber = 0; - input = fn; + iflevel = 0; + ifstate[0].skip = 0; + ifstate[0].elsepart = 1; /* to avoid a free $else */ + lex_z = z; } -void luaI_syntaxerror (char *s) + +static void luaI_auxsyntaxerror (char *s) +{ + luaL_verror("%s;\n> at line %d in file %s", + s, lua_linenumber, lua_parsedfile); +} + +static void luaI_auxsynterrbf (char *s, char *token) { - char msg[256]; - char *token = luaI_buffer(1); if (token[0] == 0) token = ""; - sprintf (msg,"%s;\n> last token read: \"%s\" at line %d in file %s", + luaL_verror("%s;\n> last token read: \"%s\" at line %d in file %s", s, token, lua_linenumber, lua_parsedfile); - lua_error (msg); +} + +void luaI_syntaxerror (char *s) +{ + luaI_auxsynterrbf(s, luaI_buffer(1)); } @@ -78,26 +104,122 @@ void luaI_addReserved (void) } } -static int inclinenumber (int pragma_allowed) + +/* +** Pragma handling +*/ + +#define PRAGMASIZE 20 + +static void skipspace (void) +{ + while (current == ' ' || current == '\t') next(); +} + + +static int checkcond (char *buff) +{ + static char *opts[] = {"nil", "1"}; + int i = luaI_findstring(buff, opts); + if (i >= 0) return i; + else if (isalpha((unsigned char)buff[0]) || buff[0] == '_') + return luaI_globaldefined(buff); + else { + luaI_auxsynterrbf("invalid $if condition", buff); + return 0; /* to avoid warnings */ + } +} + + +static void readname (char *buff) +{ + int i = 0; + skipspace(); + while (isalnum((unsigned char)current) || current == '_') { + if (i >= PRAGMASIZE) { + buff[PRAGMASIZE] = 0; + luaI_auxsynterrbf("pragma too long", buff); + } + buff[i++] = current; + next(); + } + buff[i] = 0; +} + + +static void inclinenumber (void); + + +static void ifskip (void) +{ + while (ifstate[iflevel].skip) { + if (current == '\n') + inclinenumber(); + else if (current == EOZ) + luaI_auxsyntaxerror("input ends inside a $if"); + else next(); + } +} + + +static void inclinenumber (void) { + static char *pragmas [] = + {"debug", "nodebug", "endinput", "end", "ifnot", "if", "else", NULL}; + next(); /* skip '\n' */ ++lua_linenumber; - if (pragma_allowed && current == '$') { /* is a pragma? */ - char *buff = luaI_buffer(MINBUFF+1); - int i = 0; + if (current == '$') { /* is a pragma? */ + char buff[PRAGMASIZE+1]; + int ifnot = 0; + int skip = ifstate[iflevel].skip; next(); /* skip $ */ - while (isalnum(current)) { - if (i >= MINBUFF) luaI_syntaxerror("pragma too long"); - buff[i++] = current; - next(); + readname(buff); + switch (luaI_findstring(buff, pragmas)) { + case 0: /* debug */ + if (!skip) lua_debug = 1; + break; + case 1: /* nodebug */ + if (!skip) lua_debug = 0; + break; + case 2: /* endinput */ + if (!skip) { + current = EOZ; + iflevel = 0; /* to allow $endinput inside a $if */ + } + break; + case 3: /* end */ + if (iflevel-- == 0) + luaI_auxsyntaxerror("unmatched $endif"); + break; + case 4: /* ifnot */ + ifnot = 1; + /* go through */ + case 5: /* if */ + if (iflevel == MAX_IFS-1) + luaI_auxsyntaxerror("too many nested `$ifs'"); + readname(buff); + iflevel++; + ifstate[iflevel].elsepart = 0; + ifstate[iflevel].condition = checkcond(buff) ? !ifnot : ifnot; + ifstate[iflevel].skip = skip || !ifstate[iflevel].condition; + break; + case 6: /* else */ + if (ifstate[iflevel].elsepart) + luaI_auxsyntaxerror("unmatched $else"); + ifstate[iflevel].elsepart = 1; + ifstate[iflevel].skip = + ifstate[iflevel-1].skip || ifstate[iflevel].condition; + break; + default: + luaI_auxsynterrbf("invalid pragma", buff); } - buff[i] = 0; - if (strcmp(buff, "debug") == 0) - lua_debug = 1; - else if (strcmp(buff, "nodebug") == 0) - lua_debug = 0; - else luaI_syntaxerror("invalid pragma"); + skipspace(); + if (current == '\n') /* pragma must end with a '\n' ... */ + inclinenumber(); + else if (current != EOZ) /* or eof */ + luaI_auxsyntaxerror("invalid pragma format"); + ifskip(); } - return lua_linenumber; } static int read_long_string (char *yytext, int buffsize) @@ -110,7 +232,7 @@ static int read_long_string (char *yytext, int buffsize) yytext = luaI_buffer(buffsize *= 2); switch (current) { - case 0: + case EOZ: save(0); return WRONGTOKEN; case '[': @@ -131,8 +253,8 @@ static int read_long_string (char *yytext, int buffsize) } continue; case '\n': - save_and_next(); - inclinenumber(0); + save('\n'); + inclinenumber(); continue; default: save_and_next(); @@ -162,8 +284,8 @@ int luaY_lex (void) switch (current) { case '\n': - next(); - linelasttoken = inclinenumber(1); + inclinenumber(); + linelasttoken = lua_linenumber; continue; case ' ': case '\t': case '\r': /* CR: to avoid problems with DOS */ @@ -173,7 +295,7 @@ int luaY_lex (void) case '-': save_and_next(); if (current != '-') return '-'; - do { next(); } while (current != '\n' && current != 0); + do { next(); } while (current != '\n' && current != EOZ); continue; case '[': @@ -216,7 +338,7 @@ int luaY_lex (void) yytext = luaI_buffer(buffsize *= 2); switch (current) { - case 0: + case EOZ: case '\n': save(0); return WRONGTOKEN; @@ -227,7 +349,7 @@ int luaY_lex (void) case 'n': save('\n'); next(); break; case 't': save('\t'); next(); break; case 'r': save('\r'); next(); break; - case '\n': save_and_next(); inclinenumber(0); break; + case '\n': save('\n'); inclinenumber(); break; default : save_and_next(); break; } break; @@ -258,7 +380,9 @@ int luaY_lex (void) case '_': { TaggedString *ts; - do { save_and_next(); } while (isalnum(current) || current == '_'); + do { + save_and_next(); + } while (isalnum((unsigned char)current) || current == '_'); save(0); ts = lua_createstring(yytext); if (ts->marked > 2) @@ -280,7 +404,7 @@ int luaY_lex (void) } else return CONC; /* .. */ } - else if (!isdigit(current)) return '.'; + else if (!isdigit((unsigned char)current)) return '.'; /* current is a digit: goes through to number */ a=0.0; goto fraction; @@ -291,7 +415,7 @@ int luaY_lex (void) do { a=10.0*a+(current-'0'); save_and_next(); - } while (isdigit(current)); + } while (isdigit((unsigned char)current)); if (current == '.') { save_and_next(); if (current == '.') @@ -300,7 +424,7 @@ int luaY_lex (void) } fraction: { double da=0.1; - while (isdigit(current)) + while (isdigit((unsigned char)current)) { a+=(current-'0')*da; da/=10.0; @@ -314,11 +438,12 @@ int luaY_lex (void) save_and_next(); neg=(current=='-'); if (current == '+' || current == '-') save_and_next(); - if (!isdigit(current)) { save(0); return WRONGTOKEN; } + if (!isdigit((unsigned char)current)) { + save(0); return WRONGTOKEN; } do { e=10.0*e+(current-'0'); save_and_next(); - } while (isdigit(current)); + } while (isdigit((unsigned char)current)); for (ea=neg?0.1:10.0; e>0; e>>=1) { if (e & 1) a*=ea; @@ -330,11 +455,15 @@ int luaY_lex (void) return NUMBER; } - default: /* also end of program (0) */ - { + case EOZ: + save(0); + if (iflevel > 0) + luaI_syntaxerror("missing $endif"); + return 0; + + default: save_and_next(); return yytext[0]; - } } } } diff --git a/src/lex.h b/src/lex.h index 5245d06..a942cf6 100644 --- a/src/lex.h +++ b/src/lex.h @@ -1,16 +1,15 @@ /* ** lex.h ** TecCGraf - PUC-Rio -** $Id: lex.h,v 1.3 1996/11/08 12:49:35 roberto Exp $ +** $Id: lex.h,v 1.4 1997/06/16 16:50:22 roberto Exp $ */ #ifndef lex_h #define lex_h +#include "zio.h" -typedef int (*Input) (void); - -void lua_setinput (Input fn); +void lua_setinput (ZIO *z); void luaI_syntaxerror (char *s); int luaY_lex (void); void luaI_addReserved (void); diff --git a/src/lua.stx b/src/lua.stx index 0075260..3a1bf62 100644 --- a/src/lua.stx +++ b/src/lua.stx @@ -1,13 +1,13 @@ %{ -char *rcs_luastx = "$Id: lua.stx,v 3.41 1996/11/08 12:49:35 roberto Exp $"; +char *rcs_luastx = "$Id: lua.stx,v 3.47 1997/06/19 17:46:12 roberto Exp $"; #include #include #include #include "luadebug.h" -#include "mem.h" +#include "luamem.h" #include "lex.h" #include "opcode.h" #include "hash.h" @@ -50,8 +50,6 @@ static TaggedString *localvar[MAXLOCALS]; /* store local variable names */ static int nlocalvar=0; /* number of local variables */ #define MAXFIELDS FIELDS_PER_FLUSH*2 -static Word fields[MAXFIELDS]; /* fieldnames to be flushed */ -static int nfields=0; int lua_debug = 0; @@ -103,22 +101,11 @@ static void code_word_at (Byte *p, int n) memcpy(p, &w, sizeof(Word)); } -static void push_field (Word name) -{ - if (nfields < MAXFIELDS) - fields[nfields++] = name; - else - yyerror ("too many fields in nested constructors"); -} - static void flush_record (int n) { - int i; if (n == 0) return; - code_byte(STORERECORD); + code_byte(STOREMAP); code_byte(n); - for (i=0; i= 0 && f <= (float)MAX_WORD && (float)(i=(Word)f) == f) { + /* f has an (short) integer value */ if (i <= 2) code_byte(PUSH0 + i); else if (i <= 255) { @@ -459,7 +457,7 @@ void lua_parse (TFunc *tf) %% /* beginning of rules section */ -chunk : chunklist ret +chunk : chunklist ret ; chunklist : /* empty */ | chunklist stat sc @@ -477,8 +475,7 @@ function : FUNCTION funcname body funcname : var { $$ =$1; init_func(); } | varexp ':' NAME { - code_byte(PUSHSTRING); - code_word(luaI_findconstant($3)); + code_constant($3); $$ = 0; /* indexed variable */ init_func(); add_localvar(luaI_createfixedstring("self")); @@ -492,7 +489,6 @@ body : '(' parlist ')' block END luaI_initTFunc($$); $$->size = pc; $$->code = newvector(pc, Byte); - $$->fileName = lua_parsedfile; $$->lineDefined = $2; memcpy($$->code, basepc, pc*sizeof(Byte)); if (lua_debug) @@ -540,7 +536,7 @@ stat : IF expr1 THEN PrepJump block PrepJump elsepart END lua_codeadjust (0); } } - | functioncall + | functioncall {;} | LOCAL localdeclist decinit { nlocalvar += $2; adjust_mult_assign($2, $3, 0); @@ -605,9 +601,8 @@ expr : '(' expr ')' { $$ = $2; } | NUMBER { code_number($1); $$ = 0; } | STRING { - code_byte(PUSHSTRING); - code_word($1); - $$ = 0; + code_string($1); + $$ = 0; } | NIL {code_byte(PUSHNIL); $$ = 0; } | functioncall { $$ = $1; } @@ -723,12 +718,13 @@ ffieldlist1 : ffield {$$=1;} } ; -ffield : NAME '=' expr1 - { - push_field(luaI_findconstant($1)); - } +ffield : ffieldkey '=' expr1 ; +ffieldkey : '[' expr1 ']' + | NAME { code_constant($1); } + ; + lfieldlist : /* empty */ { $$ = 0; } | lfieldlist1 lastcomma { $$ = $1; } ; @@ -762,9 +758,8 @@ var : singlevar { $$ = $1; } } | varexp '.' NAME { - code_byte(PUSHSTRING); - code_word(luaI_findconstant($3)); - $$ = 0; /* indexed variable */ + code_constant($3); + $$ = 0; /* indexed variable */ } ; diff --git a/src/luac/dump.c b/src/luac/dump.c index 656cc29..73839f3 100644 --- a/src/luac/dump.c +++ b/src/luac/dump.c @@ -3,15 +3,13 @@ ** thread and save bytecodes to file */ -char* rcs_dump="$Id: dump.c,v 1.17 1996/11/18 11:18:29 lhf Exp $"; +char* rcs_dump="$Id: dump.c,v 1.20 1997/06/19 14:56:04 lhf Exp $"; #include #include #include #include "luac.h" -static TFunc* lastF=NULL; /* list of functions seen in code */ - static int SawVar(int i, int at) { int old=VarLoc(i); @@ -34,7 +32,7 @@ static void ThreadCode(Byte* code, Byte* end) for (i=0; imarked=at; - tf->next=NULL; /* TODO: remove? */ - lastF=lastF->next=tf; - break; - } case PUSHGLOBAL: case STOREGLOBAL: { @@ -151,8 +144,8 @@ static void ThreadCode(Byte* code, Byte* end) } break; } - default: - fprintf(stderr,"luac: cannot happen: opcode=%d",*p); + default: /* cannot happen */ + fprintf(stderr,"luac: bad opcode %d at %d\n",*p,(int)(p-code)); exit(1); break; } @@ -186,7 +179,7 @@ static void DumpString(char* s, FILE* D) int n=strlen(s)+1; if ((Word)n != n) { - fprintf(stderr,"luac: string too long: \"%.32s...\"\n",s); + fprintf(stderr,"luac: string too long (%d bytes): \"%.32s...\"\n",n,s); exit(1); } DumpWord(n,D); @@ -220,7 +213,6 @@ static void DumpStrings(FILE* D) void DumpFunction(TFunc* tf, FILE* D) { - lastF=tf; ThreadCode(tf->code,tf->code+tf->size); fputc(ID_FUN,D); DumpSize(tf->size,D); diff --git a/src/luac/luac.c b/src/luac/luac.c index 7546c1b..713da1f 100644 --- a/src/luac/luac.c +++ b/src/luac/luac.c @@ -1,25 +1,39 @@ /* ** luac.c -** lua compiler (saves bytecodes to files) +** lua compiler (saves bytecodes to files; also list binary files) */ -char* rcs_luac="$Id: luac.c,v 1.18 1996/11/16 20:14:23 lhf Exp $"; +char* rcs_luac="$Id: luac.c,v 1.23 1997/06/20 20:34:04 lhf Exp $"; #include #include #include #include "luac.h" +#include "lex.h" +#include "zio.h" static void compile(char* filename); +static void undump(char* filename); static int listing=0; /* list bytecodes? */ static int dumping=1; /* dump bytecodes? */ +static int undumping=0; /* undump bytecodes? */ static FILE* D; /* output file */ static void usage(void) { - fprintf(stderr,"usage: luac [-dlpv] [-o output] file ...\n"); - exit(0); + fprintf(stderr, + "usage: luac [-c | -u] [-d] [-l] [-p] [-q] [-v] [-o output] file ...\n" + " -c\tcompile (default)\n" + " -u\tundump\n" + " -d\tgenerate debugging information\n" + " -l\tlist (default for -u)\n" + " -o\toutput file for -c (default \"luac.out\")\n" + " -p\tparse only\n" + " -q\tquiet (default for -c)\n" + " -v\tshow version information\n" + ); + exit(1); } #define IS(s) (strcmp(argv[i],s)==0) @@ -34,6 +48,11 @@ int main(int argc, char* argv[]) break; else if (IS("-")) /* use stdin */ break; + else if (IS("-c")) /* compile (and dump) */ + { + dumping=1; + undumping=0; + } else if (IS("-d")) /* debug */ lua_debug=1; else if (IS("-l")) /* list */ @@ -42,6 +61,14 @@ int main(int argc, char* argv[]) d=argv[++i]; else if (IS("-p")) /* parse only (for timing purposes) */ dumping=0; + else if (IS("-q")) /* quiet */ + listing=0; + else if (IS("-u")) /* undump */ + { + dumping=0; + undumping=1; + listing=1; + } else if (IS("-v")) /* show version */ printf("%s %s\n(written by %s)\n\n",LUA_VERSION,LUA_COPYRIGHT,LUA_AUTHORS); else /* unknown option */ @@ -50,56 +77,114 @@ int main(int argc, char* argv[]) --i; /* fake new argv[0] */ argc-=i; argv+=i; - if (argc<2) usage(); - for (i=1; inext) PrintFunction(tf,Main); + } + if (dumping) { - TFunc* nf; - if (listing) PrintFunction(tf); - if (dumping) DumpFunction(tf,D); - nf=tf->next; /* list only built after first main */ + DumpHeader(D); + for (tf=Main; tf!=NULL; tf=tf->next) DumpFunction(tf,D); + } + for (tf=Main; tf!=NULL; ) + { + TFunc* nf=tf->next; luaI_freefunc(tf); tf=nf; } } -static void do_compile(void) +static void do_compile(ZIO* z) { TFunc* tf=new(TFunc); + lua_setinput(z); luaI_initTFunc(tf); - tf->fileName = lua_parsedfile; + tf->fileName=lua_parsedfile; lua_parse(tf); do_dump(tf); } static void compile(char* filename) { - if (lua_openfile(filename)==NULL) + FILE* f= (filename==NULL) ? stdin : fopen(filename, "r"); + if (f==NULL) + { + fprintf(stderr,"luac: cannot open "); + perror(filename); + exit(1); + } + else + { + ZIO z; + zFopen(&z,f); + luaI_setparsedfile(filename?filename:"(stdin)"); + do_compile(&z); + fclose(f); + } +} + +static void do_undump(ZIO* z) +{ + TFunc* Main; + while ((Main=luaI_undump1(z))) + { + if (listing) + { + TFunc* tf; + for (tf=Main; tf!=NULL; tf=tf->next) + PrintFunction(tf,Main); + } + luaI_freefunc(Main); /* TODO: free others */ + } +} + +static void undump(char* filename) +{ + FILE* f= (filename==NULL) ? stdin : fopen(filename, "rb"); + if (f==NULL) { fprintf(stderr,"luac: cannot open "); perror(filename); exit(1); } - do_compile(); - lua_closefile(); + else + { + ZIO z; + zFopen(&z,f); + do_undump(&z); + fclose(f); + } } diff --git a/src/luac/luac.h b/src/luac/luac.h index ceb311b..815824c 100644 --- a/src/luac/luac.h +++ b/src/luac/luac.h @@ -1,24 +1,25 @@ /* ** luac.h ** definitions for luac compiler -** $Id: luac.h,v 1.5 1996/03/08 21:41:47 lhf Exp $ +** $Id: luac.h,v 1.8 1997/06/19 17:32:08 lhf Exp $ */ #include "inout.h" -#include "mem.h" +#include "luamem.h" #include "opcode.h" #include "table.h" #include "undump.h" #define VarStr(i) (lua_table[i].varname->str) -#define VarLoc(i) (lua_table[i].varname->varindex) +#define VarLoc(i) (lua_table[i].varname->u.s.varindex) #define StrStr(i) (lua_constant[i]->str) -#define StrLoc(i) (lua_constant[i]->constindex) +#define StrLoc(i) (lua_constant[i]->u.s.constindex) extern Word lua_ntable; extern Word lua_nconstant; extern int lua_debug; +void LinkFunctions(TFunc* tf); +void PrintFunction(TFunc* tf, TFunc* Main); void DumpHeader(FILE* D); void DumpFunction(TFunc* tf, FILE* D); -void PrintFunction(TFunc* tf); diff --git a/src/luac/print.c b/src/luac/print.c index 0e1d256..fb7bf8a 100644 --- a/src/luac/print.c +++ b/src/luac/print.c @@ -3,7 +3,7 @@ ** print bytecodes */ -char* rcs_print="$Id: print.c,v 1.11 1996/11/18 11:24:16 lhf Exp $"; +char* rcs_print="$Id: print.c,v 1.17 1997/06/25 17:07:28 lhf Exp $"; #include #include @@ -11,20 +11,134 @@ char* rcs_print="$Id: print.c,v 1.11 1996/11/18 11:24:16 lhf Exp $"; #include "luac.h" #include "print.h" -static LocVar* V=NULL; - -static char* LocStr(int i) +void LinkFunctions(TFunc* m) { - if (V==NULL) return ""; else return V[i].varname->str; + static TFunc* lastF; /* list of functions seen in code */ + Byte* code=m->code; + Byte* end=code+m->size; + Byte* p; + if (IsMain(m)) lastF=m; + for (p=code; p!=end;) + { + int op=*p; + int at=p-code+1; + switch (op) + { + case PUSHNIL: + case PUSH0: + case PUSH1: + case PUSH2: + case PUSHLOCAL0: + case PUSHLOCAL1: + case PUSHLOCAL2: + case PUSHLOCAL3: + case PUSHLOCAL4: + case PUSHLOCAL5: + case PUSHLOCAL6: + case PUSHLOCAL7: + case PUSHLOCAL8: + case PUSHLOCAL9: + case PUSHINDEXED: + case STORELOCAL0: + case STORELOCAL1: + case STORELOCAL2: + case STORELOCAL3: + case STORELOCAL4: + case STORELOCAL5: + case STORELOCAL6: + case STORELOCAL7: + case STORELOCAL8: + case STORELOCAL9: + case STOREINDEXED0: + case ADJUST0: + case EQOP: + case LTOP: + case LEOP: + case GTOP: + case GEOP: + case ADDOP: + case SUBOP: + case MULTOP: + case DIVOP: + case POWOP: + case CONCOP: + case MINUSOP: + case NOTOP: + case POP: + case RETCODE0: + p++; + break; + case PUSHBYTE: + case PUSHLOCAL: + case STORELOCAL: + case STOREINDEXED: + case STORELIST0: + case ADJUST: + case RETCODE: + case VARARGS: + case STOREMAP: + p+=2; + break; + case PUSHWORD: + case PUSHSTRING: + case PUSHGLOBAL: + case PUSHSELF: + case STOREGLOBAL: + case CREATEARRAY: + case ONTJMP: + case ONFJMP: + case JMP: + case UPJMP: + case IFFJMP: + case IFFUPJMP: + case CALLFUNC: + case SETLINE: + case STORELIST: + p+=3; + break; + case PUSHFLOAT: + p+=5; /* assumes sizeof(float)==4 */ + break; + case PUSHFUNCTION: + { + TFunc* tf; + p++; + get_code(tf,p); + tf->marked=at; + tf->next=NULL; /* TODO: remove? */ + lastF=lastF->next=tf; + break; + } + case STORERECORD: + { + int n=*++p; + p+=2*n+1; + break; + } + default: /* cannot happen */ + fprintf(stderr,"luac: bad opcode %d at %d\n",*p,(int)(p-code)); + exit(1); + break; + } + } } -static void PrintCode(Byte* code, Byte* end) +#define LocStr(i) luaI_getlocalname(tf,i+1,line) + +static void PrintCode(TFunc* tf) { + Byte* code=tf->code; + Byte* end=code+tf->size; Byte* p; + int line=0; for (p=code; p!=end;) { - OpCode op=(OpCode)*p; - if (op>SETLINE) op=SETLINE+1; + int op=*p; + if (op>=NOPCODES) + { + fprintf(stderr,"luac: bad opcode %d at %d\n",op,(int)(p-code)); + exit(1); + } printf("%6d\t%s",(int)(p-code),OpCodeName[op]); switch (op) { @@ -64,7 +178,7 @@ static void PrintCode(Byte* code, Byte* end) case PUSHLOCAL9: { int i=op-PUSHLOCAL0; - printf("\t%d\t; %s",i,LocStr(i)); + if (tf->locvars) printf("\t\t; %s",LocStr(i)); p++; break; } @@ -80,7 +194,7 @@ static void PrintCode(Byte* code, Byte* end) case STORELOCAL9: { int i=op-STORELOCAL0; - printf("\t%d\t; %s",i,LocStr(i)); + if (tf->locvars) printf("\t\t; %s",LocStr(i)); p++; break; } @@ -88,7 +202,7 @@ static void PrintCode(Byte* code, Byte* end) case STORELOCAL: { int i=*(p+1); - printf("\t%d\t; %s",i,LocStr(i)); + if (tf->locvars) printf("\t%d\t; %s",i,LocStr(i)); p+=2; break; } @@ -97,23 +211,40 @@ static void PrintCode(Byte* code, Byte* end) case STORELIST0: case ADJUST: case RETCODE: + case VARARGS: + case STOREMAP: printf("\t%d",*(p+1)); p+=2; break; case PUSHWORD: case CREATEARRAY: + case SETLINE: + { + Word w; + p++; + get_word(w,p); + printf("\t%d",w); + if (op==SETLINE) line=w; + break; + } case ONTJMP: case ONFJMP: case JMP: - case UPJMP: case IFFJMP: + { /* suggested by Norman Ramsey */ + Word w; + p++; + get_word(w,p); + printf("\t%d\t\t; to %d",w,(int)(p-code)+w); + break; + } + case UPJMP: case IFFUPJMP: - case SETLINE: - { + { /* suggested by Norman Ramsey */ Word w; p++; get_word(w,p); - printf("\t%d",w); + printf("\t%d\t\t; to %d",w,(int)(p-code)-w); break; } case PUSHFLOAT: @@ -170,7 +301,8 @@ static void PrintCode(Byte* code, Byte* end) break; } default: - printf("\tcannot happen: opcode=%d",*p); + printf("\tcannot happen: opcode=%d\n",*p); + fprintf(stderr,"luac: bad opcode %d at %d\n",op,(int)(p-code)); exit(1); break; } @@ -178,13 +310,74 @@ static void PrintCode(Byte* code, Byte* end) } } -void PrintFunction(TFunc* tf) +#undef LocStr + +static void PrintLocals(LocVar* v, int n) { + int i=0; + if (v==NULL || v->varname==NULL) return; + if (n>0) + { + printf("parameters:"); + for (i=0; ivarname->str,i,v->line); + printf("\n"); + } + if (v->varname!=NULL) + { + printf("locals:"); + for (; v->line>=0; v++) + { + if (v->varname==NULL) +#if 0 + printf(" %s[%d@%d]","*",--i,v->line); +#else + --i; +#endif + else + printf(" %s[%d@%d]",v->varname->str,i++,v->line); + } + printf("\n"); + } +} + +void PrintFunction(TFunc* tf, TFunc* Main) +{ + int n=0; if (IsMain(tf)) printf("\nmain of \"%s\" (%d bytes at %p)\n",tf->fileName,tf->size,tf); else - printf("\nfunction \"%s\":%d (%d bytes at %p); used at main+%d\n", + { + Byte* p; + p=tf->code; /* get number of parameters */ + while (*p==SETLINE) p+=3; + if (*p==ADJUST) n=p[1]; + p=Main->code+tf->marked+sizeof(TFunc*); + printf("\nfunction "); + switch (*p) /* try to get name */ + { + case STOREGLOBAL: + { + Word w; + p++; get_word(w,p); printf("%s defined at ",VarStr(w)); + break; + } + case STOREINDEXED0: /* try method definition */ + { + if (p[-11]==PUSHGLOBAL && p[-8]==PUSHSTRING) + { + Word w; + Byte* op=p; + int c=(tf->locvars && n>0 && strcmp(tf->locvars->varname->str,"self")==0) + ? ':' : '.'; + p=op-11; p++; get_word(w,p); printf("%s%c",VarStr(w),c); + p=op-8; p++; get_word(w,p); printf("%s defined at ",StrStr(w)); + } + break; + } + } + printf("\"%s\":%d (%d bytes at %p); used at main+%d\n", tf->fileName,tf->lineDefined,tf->size,tf,tf->marked); - V=tf->locvars; - PrintCode(tf->code,tf->code+tf->size); + } + PrintLocals(tf->locvars,n); + PrintCode(tf); } diff --git a/src/luac/print.h b/src/luac/print.h index 31e2bb8..00e344c 100644 --- a/src/luac/print.h +++ b/src/luac/print.h @@ -1,10 +1,10 @@ /* ** print.h ** opcode names -** $Id: print.h,v 1.1 1996/02/23 19:04:13 lhf Exp $ +** $Id: print.h,v 1.3 1997/04/14 14:42:50 lhf Exp $ */ -static char* OpCodeName[]={ /* attention: same order as enum in opcode.h */ +static char* OpCodeName[]={ /* ATTENTION: same order as enum in opcode.h */ "PUSHNIL", "PUSH0", "PUSH1", @@ -72,5 +72,8 @@ static char* OpCodeName[]={ /* attention: same order as enum in opcode.h */ "RETCODE0", "RETCODE", "SETLINE", - "" + "VARARGS", + "STOREMAP" }; + +#define NOPCODES (sizeof(OpCodeName)/sizeof(OpCodeName[0])) diff --git a/src/luamem.c b/src/luamem.c new file mode 100644 index 0000000..e4cdd6d --- /dev/null +++ b/src/luamem.c @@ -0,0 +1,159 @@ +/* +** mem.c +** TecCGraf - PUC-Rio +*/ + +char *rcs_luamem = "$Id: luamem.c,v 1.16 1997/04/01 21:23:20 roberto Exp $"; + +#include + +#include "luamem.h" +#include "lua.h" + + +#define DEBUG 0 + +#if !DEBUG + +void luaI_free (void *block) +{ + if (block) + { + *((char *)block) = -1; /* to catch errors */ + free(block); + } +} + + +void *luaI_realloc (void *oldblock, unsigned long size) +{ + void *block; + size_t s = (size_t)size; + if (s != size) + lua_error("Allocation Error: Block too big"); + block = oldblock ? realloc(oldblock, s) : malloc(s); + if (block == NULL) + lua_error(memEM); + return block; +} + + +int luaI_growvector (void **block, unsigned long nelems, int size, + char *errormsg, unsigned long limit) +{ + if (nelems >= limit) + lua_error(errormsg); + nelems = (nelems == 0) ? 20 : nelems*2; + if (nelems > limit) + nelems = limit; + *block = luaI_realloc(*block, nelems*size); + return (int)nelems; +} + + +void* luaI_buffer (unsigned long size) +{ + static unsigned long buffsize = 0; + static char* buffer = NULL; + if (size > buffsize) + buffer = luaI_realloc(buffer, buffsize=size); + return buffer; +} + +#else +/* DEBUG */ + +#include + +# define assert(ex) {if (!(ex)){(void)fprintf(stderr, \ + "Assertion failed: file \"%s\", line %d\n", __FILE__, __LINE__);exit(1);}} + +#define MARK 55 + +static unsigned long numblocks = 0; +static unsigned long totalmem = 0; + + +static void message (void) +{ +#define inrange(x,y) ((x) < (((y)*3)/2) && (x) > (((y)*2)/3)) + static int count = 0; + static unsigned long lastnumblocks = 0; + static unsigned long lasttotalmem = 0; + if (!inrange(numblocks, lastnumblocks) || !inrange(totalmem, lasttotalmem) + || count++ >= 5000) + { + fprintf(stderr,"blocks = %lu mem = %luK\n", numblocks, totalmem/1000); + count = 0; + lastnumblocks = numblocks; + lasttotalmem = totalmem; + } +} + + +void luaI_free (void *block) +{ + if (block) + { + unsigned long *b = (unsigned long *)block - 1; + unsigned long size = *b; + assert(*(((char *)b)+size+sizeof(unsigned long)) == MARK); + numblocks--; + totalmem -= size; + free(b); + message(); + } +} + + +void *luaI_realloc (void *oldblock, unsigned long size) +{ + unsigned long *block; + unsigned long realsize = sizeof(unsigned long)+size+sizeof(char); + if (realsize != (size_t)realsize) + lua_error("Allocation Error: Block too big"); + if (oldblock) + { + unsigned long *b = (unsigned long *)oldblock - 1; + unsigned long oldsize = *b; + assert(*(((char *)b)+oldsize+sizeof(unsigned long)) == MARK); + totalmem -= oldsize; + numblocks--; + block = (unsigned long *)realloc(b, realsize); + } + else + block = (unsigned long *)malloc(realsize); + if (block == NULL) + lua_error("not enough memory"); + totalmem += size; + numblocks++; + *block = size; + *(((char *)block)+size+sizeof(unsigned long)) = MARK; + message(); + return block+1; +} + + +int luaI_growvector (void **block, unsigned long nelems, int size, + char *errormsg, unsigned long limit) +{ + if (nelems >= limit) + lua_error(errormsg); + nelems = (nelems == 0) ? 20 : nelems*2; + if (nelems > limit) + nelems = limit; + *block = luaI_realloc(*block, nelems*size); + return (int)nelems; +} + + +void* luaI_buffer (unsigned long size) +{ + static unsigned long buffsize = 0; + static char* buffer = NULL; + if (size > buffsize) + buffer = luaI_realloc(buffer, buffsize=size); + return buffer; +} + +#endif diff --git a/src/mem.h b/src/luamem.h similarity index 91% rename from src/mem.h rename to src/luamem.h index 86f024f..86b7c8f 100644 --- a/src/mem.h +++ b/src/luamem.h @@ -1,11 +1,11 @@ /* ** mem.c ** memory manager for lua -** $Id: mem.h,v 1.8 1996/05/24 14:31:10 roberto Exp $ +** $Id: luamem.h,v 1.9 1997/03/31 14:10:11 roberto Exp $ */ -#ifndef mem_h -#define mem_h +#ifndef luamem_h +#define luamem_h #ifndef NULL #define NULL 0 diff --git a/src/mem.c b/src/mem.c deleted file mode 100644 index 4e3bcc5..0000000 --- a/src/mem.c +++ /dev/null @@ -1,58 +0,0 @@ -/* -** mem.c -** TecCGraf - PUC-Rio -*/ - -char *rcs_mem = "$Id: mem.c,v 1.13 1996/05/24 14:31:10 roberto Exp $"; - -#include - -#include "mem.h" -#include "lua.h" - - -void luaI_free (void *block) -{ - if (block) - { - *((int *)block) = -1; /* to catch errors */ - free(block); - } -} - - -void *luaI_realloc (void *oldblock, unsigned long size) -{ - void *block; - size_t s = (size_t)size; - if (s != size) - lua_error("Allocation Error: Block too big"); - block = oldblock ? realloc(oldblock, s) : malloc(s); - if (block == NULL) - lua_error(memEM); - return block; -} - - -int luaI_growvector (void **block, unsigned long nelems, int size, - char *errormsg, unsigned long limit) -{ - if (nelems >= limit) - lua_error(errormsg); - nelems = (nelems == 0) ? 20 : nelems*2; - if (nelems > limit) - nelems = limit; - *block = luaI_realloc(*block, nelems*size); - return (int)nelems; -} - - -void* luaI_buffer (unsigned long size) -{ - static unsigned long buffsize = 0; - static char* buffer = NULL; - if (size > buffsize) - buffer = luaI_realloc(buffer, buffsize=size); - return buffer; -} - diff --git a/src/opcode.c b/src/opcode.c index c3bcf54..ea18f9e 100644 --- a/src/opcode.c +++ b/src/opcode.c @@ -3,7 +3,7 @@ ** TecCGraf - PUC-Rio */ -char *rcs_opcode="$Id: opcode.c,v 3.77 1996/11/18 13:48:44 roberto Exp $"; +char *rcs_opcode="$Id: opcode.c,v 4.15 1997/06/26 21:40:57 roberto Exp $"; #include #include @@ -11,17 +11,18 @@ char *rcs_opcode="$Id: opcode.c,v 3.77 1996/11/18 13:48:44 roberto Exp $"; #include #include "luadebug.h" -#include "mem.h" +#include "luamem.h" #include "opcode.h" #include "hash.h" #include "inout.h" #include "table.h" #include "lua.h" #include "fallback.h" -#include "undump.h" +#include "auxlib.h" +#include "lex.h" -#define tonumber(o) ((tag(o) != LUA_T_NUMBER) && (lua_tonumber(o) != 0)) -#define tostring(o) ((tag(o) != LUA_T_STRING) && (lua_tostring(o) != 0)) +#define tonumber(o) ((ttype(o) != LUA_T_NUMBER) && (lua_tonumber(o) != 0)) +#define tostring(o) ((ttype(o) != LUA_T_STRING) && (lua_tostring(o) != 0)) #define STACK_SIZE 128 @@ -32,14 +33,14 @@ char *rcs_opcode="$Id: opcode.c,v 3.77 1996/11/18 13:48:44 roberto Exp $"; typedef int StkId; /* index to stack elements */ -static Object initial_stack; +static TObject initial_stack; -static Object *stackLimit = &initial_stack+1; -static Object *stack = &initial_stack; -static Object *top = &initial_stack; +static TObject *stackLimit = &initial_stack+1; +static TObject *stack = &initial_stack; +static TObject *top = &initial_stack; -/* macros to convert from lua_Object to (Object *) and back */ +/* macros to convert from lua_Object to (TObject *) and back */ #define Address(lo) ((lo)+stack-1) #define Ref(st) ((st)-stack+1) @@ -51,13 +52,13 @@ static Object *top = &initial_stack; #define incr_top if (++top >= stackLimit) growstack() struct C_Lua_Stack { - StkId base; /* when Lua calls C or C calls Lua, points to */ - /* the first slot after the last parameter. */ - int num; /* when Lua calls C, has the number of parameters; */ - /* when C calls Lua, has the number of results. */ + StkId base; /* when Lua calls C or C calls Lua, points to */ + /* the first slot after the last parameter. */ + StkId lua2C; /* points to first element of "array" lua2C */ + int num; /* size of "array" lua2C */ }; -static struct C_Lua_Stack CLS_current = {0, 0}; +static struct C_Lua_Stack CLS_current = {0, 0, 0}; static jmp_buf *errorJmp = NULL; /* current error recover point */ @@ -72,7 +73,7 @@ static void do_call (StkId base, int nResults); -Object *luaI_Address (lua_Object o) +TObject *luaI_Address (lua_Object o) { return Address(o); } @@ -84,7 +85,7 @@ Object *luaI_Address (lua_Object o) static void lua_initstack (void) { Long maxstack = STACK_SIZE; - stack = newvector(maxstack, Object); + stack = newvector(maxstack, TObject); stackLimit = stack+maxstack; top = stack; *(top++) = initial_stack; @@ -105,7 +106,7 @@ static void growstack (void) static int limit = STACK_LIMIT; StkId t = top-stack; Long stacksize = stackLimit - stack; - stacksize = growvector(&stack, stacksize, Object, stackEM, limit+100); + stacksize = growvector(&stack, stacksize, TObject, stackEM, limit+100); stackLimit = stack+stacksize; top = stack + t; if (stacksize >= limit) @@ -134,16 +135,16 @@ static char *lua_strconc (char *l, char *r) ** Convert, if possible, to a number object. ** Return 0 if success, not 0 if error. */ -static int lua_tonumber (Object *obj) +static int lua_tonumber (TObject *obj) { float t; char c; - if (tag(obj) != LUA_T_STRING) + if (ttype(obj) != LUA_T_STRING) return 1; else if (sscanf(svalue(obj), "%f %c",&t, &c) == 1) { nvalue(obj) = t; - tag(obj) = LUA_T_NUMBER; + ttype(obj) = LUA_T_NUMBER; return 0; } else @@ -152,39 +153,54 @@ static int lua_tonumber (Object *obj) /* -** Convert, if possible, to a string tag +** Convert, if possible, to a string ttype ** Return 0 in success or not 0 on error. */ -static int lua_tostring (Object *obj) +static int lua_tostring (TObject *obj) { - char s[256]; - if (tag(obj) != LUA_T_NUMBER) - return 1; - if ((int) nvalue(obj) == nvalue(obj)) - sprintf (s, "%d", (int) nvalue(obj)); - else - sprintf (s, "%g", nvalue(obj)); - tsvalue(obj) = lua_createstring(s); - tag(obj) = LUA_T_STRING; - return 0; + if (ttype(obj) != LUA_T_NUMBER) + return 1; + else { + char s[60]; + real f = nvalue(obj); + int i; + if ((real)(-MAX_INT) <= f && f <= (real)MAX_INT && (real)(i=(int)f) == f) + sprintf (s, "%d", i); + else + sprintf (s, "%g", nvalue(obj)); + tsvalue(obj) = lua_createstring(s); + ttype(obj) = LUA_T_STRING; + return 0; + } } /* ** Adjust stack. Set top to the given value, pushing NILs if needed. */ -static void adjust_top (StkId newtop) +static void adjust_top_aux (StkId newtop) { - Object *nt; + TObject *nt; lua_checkstack(stack+newtop); nt = stack+newtop; /* warning: previous call may change stack */ - while (top < nt) tag(top++) = LUA_T_NIL; - top = nt; /* top could be bigger than newtop */ + while (top < nt) ttype(top++) = LUA_T_NIL; } + +#define adjust_top(newtop) { if (newtop <= top-stack) \ + top = stack+newtop; \ + else adjust_top_aux(newtop); } + #define adjustC(nParams) adjust_top(CLS_current.base+nParams) +static void checkCparams (int nParams) +{ + if (top-stack < CLS_current.base+nParams) + lua_error("API error - wrong number of arguments in C2lua stack"); +} + + /* ** Open a hole below "nelems" from the top. */ @@ -197,13 +213,37 @@ static void open_stack (int nelems) } +static lua_Object put_luaObject (TObject *o) +{ + open_stack((top-stack)-CLS_current.base); + stack[CLS_current.base++] = *o; + return CLS_current.base; /* this is +1 real position (see Ref) */ +} + + +static lua_Object put_luaObjectonTop (void) +{ + open_stack((top-stack)-CLS_current.base); + stack[CLS_current.base++] = *(--top); + return CLS_current.base; /* this is +1 real position (see Ref) */ +} + + +lua_Object lua_pop (void) +{ + checkCparams(1); + return put_luaObjectonTop(); +} + + + /* ** call Line hook */ static void lineHook (int line) { struct C_Lua_Stack oldCLS = CLS_current; - StkId old_top = CLS_current.base = top-stack; + StkId old_top = CLS_current.lua2C = CLS_current.base = top-stack; CLS_current.num = 0; (*lua_linehook)(line); top = stack+old_top; @@ -218,13 +258,13 @@ static void lineHook (int line) static void callHook (StkId base, lua_Type type, int isreturn) { struct C_Lua_Stack oldCLS = CLS_current; - StkId old_top = CLS_current.base = top-stack; + StkId old_top = CLS_current.lua2C = CLS_current.base = top-stack; CLS_current.num = 0; if (isreturn) (*lua_callhook)(LUA_NOOBJECT, "(return)", 0); else { - Object *f = stack+base-1; + TObject *f = stack+base-1; if (type == LUA_T_MARK) (*lua_callhook)(Ref(f), f->value.tf->fileName, f->value.tf->lineDefined); else @@ -246,6 +286,7 @@ static StkId callC (lua_CFunction func, StkId base) StkId firstResult; CLS_current.num = (top-stack) - base; /* incorporate parameters on the stack */ + CLS_current.lua2C = base; CLS_current.base = base+CLS_current.num; /* == top-stack */ if (lua_callhook) callHook(base, LUA_T_CMARK, 0); @@ -257,15 +298,11 @@ static StkId callC (lua_CFunction func, StkId base) return firstResult; } -/* -** Call the specified fallback, putting it on the stack below its arguments -*/ -static void callFB (int fb) +static void callIM (TObject *f, int nParams, int nResults) { - int nParams = luaI_fallBacks[fb].nParams; open_stack(nParams); - *(top-nParams-1) = luaI_fallBacks[fb].function; - do_call((top-stack)-nParams, luaI_fallBacks[fb].nResults); + *(top-nParams-1) = *f; + do_call((top-stack)-nParams, nResults); } @@ -278,28 +315,28 @@ static void callFB (int fb) static void do_call (StkId base, int nResults) { StkId firstResult; - Object *func = stack+base-1; + TObject *func = stack+base-1; int i; - if (tag(func) == LUA_T_CFUNCTION) - { - tag(func) = LUA_T_CMARK; + if (ttype(func) == LUA_T_CFUNCTION) { + ttype(func) = LUA_T_CMARK; firstResult = callC(fvalue(func), base); } - else if (tag(func) == LUA_T_FUNCTION) - { - tag(func) = LUA_T_MARK; + else if (ttype(func) == LUA_T_FUNCTION) { + ttype(func) = LUA_T_MARK; firstResult = lua_execute(func->value.tf->code, base); } - else - { /* func is not a function */ - /* Call the fallback for invalid functions */ + else { /* func is not a function */ + /* Check the tag method for invalid functions */ + TObject *im = luaI_getimbyObj(func, IM_FUNCTION); + if (ttype(im) == LUA_T_NIL) + lua_error("call expression not a function"); open_stack((top-stack)-(base-1)); - stack[base-1] = luaI_fallBacks[FB_FUNCTION].function; + stack[base-1] = *im; do_call(base, nResults); return; } /* adjust the number of results */ - if (nResults != MULT_RET && top - (stack+firstResult) != nResults) + if (nResults != MULT_RET) adjust_top(firstResult+nResults); /* move results to base-1 (to erase parameters and function) */ base--; @@ -316,58 +353,110 @@ static void do_call (StkId base, int nResults) */ static void pushsubscript (void) { - if (tag(top-2) != LUA_T_ARRAY) - callFB(FB_GETTABLE); - else - { - Object *h = lua_hashget(avalue(top-2), top-1); - if (h == NULL || tag(h) == LUA_T_NIL) - callFB(FB_INDEX); - else - { - --top; - *(top-1) = *h; + TObject *im; + if (ttype(top-2) != LUA_T_ARRAY) /* not a table, get "gettable" method */ + im = luaI_getimbyObj(top-2, IM_GETTABLE); + else { /* object is a table... */ + int tg = (top-2)->value.a->htag; + im = luaI_getim(tg, IM_GETTABLE); + if (ttype(im) == LUA_T_NIL) { /* and does not have a "gettable" method */ + TObject *h = lua_hashget(avalue(top-2), top-1); + if (h != NULL && ttype(h) != LUA_T_NIL) { + --top; + *(top-1) = *h; + } + else if (ttype(im=luaI_getim(tg, IM_INDEX)) != LUA_T_NIL) + callIM(im, 2, 1); + else { + --top; + ttype(top-1) = LUA_T_NIL; + } + return; } + /* else it has a "gettable" method, go through to next command */ + } + /* object is not a table, or it has a "gettable" method */ + if (ttype(im) != LUA_T_NIL) + callIM(im, 2, 1); + else + lua_error("indexed expression not a table"); +} + + +lua_Object lua_rawgettable (void) +{ + checkCparams(2); + if (ttype(top-2) != LUA_T_ARRAY) + lua_error("indexed expression not a table in raw gettable"); + else { + TObject *h = lua_hashget(avalue(top-2), top-1); + --top; + if (h != NULL) + *(top-1) = *h; + else + ttype(top-1) = LUA_T_NIL; } + return put_luaObjectonTop(); } /* ** Function to store indexed based on values at the top +** mode = 0: raw store (without internal methods) +** mode = 1: normal store (with internal methods) +** mode = 2: "deep stack" store (with internal methods) */ -static void storesubscript (void) +static void storesubscript (TObject *t, int mode) { - if (tag(top-3) != LUA_T_ARRAY) - callFB(FB_SETTABLE); - else - { - Object *h = lua_hashdefine (avalue(top-3), top-2); - *h = *(top-1); - top -= 3; - } + TObject *im = (mode == 0) ? NULL : luaI_getimbyObj(t, IM_SETTABLE); + if (ttype(t) == LUA_T_ARRAY && (im == NULL || ttype(im) == LUA_T_NIL)) { + TObject *h = lua_hashdefine(avalue(t), t+1); + *h = *(top-1); + top -= (mode == 2) ? 1 : 3; + } + else { /* object is not a table, and/or has a specific "settable" method */ + if (im && ttype(im) != LUA_T_NIL) { + if (mode == 2) { + lua_checkstack(top+2); + *(top+1) = *(top-1); + *(top) = *(t+1); + *(top-1) = *t; + top += 2; + } + callIM(im, 3, 0); + } + else + lua_error("indexed expression not a table"); + } } static void getglobal (Word n) { - *top = lua_table[n].object; - incr_top; - if (tag(top-1) == LUA_T_NIL) - { /* must call getglobal fallback */ - tag(top-1) = LUA_T_STRING; - tsvalue(top-1) = lua_table[n].varname; - callFB(FB_GETGLOBAL); + TObject *value = &lua_table[n].object; + TObject *im = luaI_getimbyObj(value, IM_GETGLOBAL); + if (ttype(im) == LUA_T_NIL) { /* default behavior */ + *top = *value; + incr_top; } + else { + ttype(top) = LUA_T_STRING; + tsvalue(top) = lua_table[n].varname; + incr_top; + *top = *value; + incr_top; + callIM(im, 2, 1); + } } /* ** Traverse all objects on stack */ -void lua_travstack (int (*fn)(Object *)) +void lua_travstack (int (*fn)(TObject *)) { - Object *o; - for (o = top-1; o >= stack; o--) - fn (o); + StkId i; + for (i = (top-1)-stack; i>=0; i--) + fn (stack+i); } @@ -377,8 +466,11 @@ void lua_travstack (int (*fn)(Object *)) static void lua_message (char *s) { - lua_pushstring(s); - callFB(FB_ERROR); + TObject *im = luaI_geterrorim(); + if (ttype(im) != LUA_T_NIL) { + lua_pushstring(s); + callIM(im, 1, 0); + } } /* @@ -399,25 +491,25 @@ void lua_error (char *s) lua_Function lua_stackedfunction (int level) { - Object *p = top; - while (--p >= stack) - if (p->tag == LUA_T_MARK || p->tag == LUA_T_CMARK) + StkId i; + for (i = (top-1)-stack; i>=0; i--) + if (stack[i].ttype == LUA_T_MARK || stack[i].ttype == LUA_T_CMARK) if (level-- == 0) - return Ref(p); + return Ref(stack+i); return LUA_NOOBJECT; } int lua_currentline (lua_Function func) { - Object *f = Address(func); - return (f+1 < top && (f+1)->tag == LUA_T_LINE) ? (f+1)->value.i : -1; + TObject *f = Address(func); + return (f+1 < top && (f+1)->ttype == LUA_T_LINE) ? (f+1)->value.i : -1; } lua_Object lua_getlocal (lua_Function func, int local_number, char **name) { - Object *f = luaI_Address(func); + TObject *f = luaI_Address(func); *name = luaI_getlocalname(f->value.tf, local_number, lua_currentline(func)); if (*name) { @@ -431,9 +523,9 @@ lua_Object lua_getlocal (lua_Function func, int local_number, char **name) int lua_setlocal (lua_Function func, int local_number) { - Object *f = Address(func); + TObject *f = Address(func); char *name = luaI_getlocalname(f->value.tf, local_number, lua_currentline(func)); - adjustC(1); + checkCparams(1); --top; if (name) { @@ -446,6 +538,29 @@ int lua_setlocal (lua_Function func, int local_number) return 0; } +/* +** Call the function at CLS_current.base, and incorporate results on +** the Lua2C structure. +*/ +static void do_callinc (int nResults) +{ + StkId base = CLS_current.base; + do_call(base+1, nResults); + CLS_current.lua2C = base; /* position of the new results */ + CLS_current.num = (top-stack) - base; /* number of results */ + CLS_current.base = base + CLS_current.num; /* incorporate results on stack */ +} + + +static void do_unprotectedrun (lua_CFunction f, int nParams, int nResults) +{ + StkId base = (top-stack)-nParams; + open_stack(nParams); + stack[base].ttype = LUA_T_CFUNCTION; + stack[base].value.f = f; + do_call(base+1, nResults); +} + /* ** Execute a protected call. Assumes that function is at CLS_current.base and @@ -458,15 +573,11 @@ static int do_protectedrun (int nResults) struct C_Lua_Stack oldCLS = CLS_current; jmp_buf *oldErr = errorJmp; errorJmp = &myErrorJmp; - if (setjmp(myErrorJmp) == 0) - { - do_call(CLS_current.base+1, nResults); - CLS_current.num = (top-stack) - CLS_current.base; /* number of results */ - CLS_current.base += CLS_current.num; /* incorporate results on the stack */ + if (setjmp(myErrorJmp) == 0) { + do_callinc(nResults); status = 0; } - else - { /* an error occurred: restore CLS_current and top */ + else { /* an error occurred: restore CLS_current and top */ CLS_current = oldCLS; top = stack+CLS_current.base; status = 1; @@ -479,13 +590,14 @@ int luaI_dorun (TFunc *tf) { int status; adjustC(1); /* one slot for the pseudo-function */ - stack[CLS_current.base].tag = LUA_T_FUNCTION; + stack[CLS_current.base].ttype = LUA_T_FUNCTION; stack[CLS_current.base].value.tf = tf; status = do_protectedrun(MULT_RET); return status; } -static int do_protectedmain (void) + +int lua_domain (void) { TFunc tf; int status; @@ -493,23 +605,21 @@ static int do_protectedmain (void) jmp_buf *oldErr = errorJmp; errorJmp = &myErrorJmp; luaI_initTFunc(&tf); - tf.fileName = lua_parsedfile; - if (setjmp(myErrorJmp) == 0) - { + if (setjmp(myErrorJmp) == 0) { lua_parse(&tf); - status = luaI_dorun(&tf); + status = 0; } - else - { - status = 1; + else { adjustC(0); /* erase extra slot */ + status = 1; } + if (status == 0) + status = luaI_dorun(&tf); errorJmp = oldErr; luaI_free(tf.code); return status; } - /* ** Execute the given lua function. Return 0 on success or 1 on error. */ @@ -526,71 +636,31 @@ int lua_callfunction (lua_Object function) } -int lua_call (char *funcname) +lua_Object lua_gettagmethod (int tag, char *event) { - Word n = luaI_findsymbolbyname(funcname); - open_stack((top-stack)-CLS_current.base); - stack[CLS_current.base] = s_object(n); - return do_protectedrun(MULT_RET); + lua_pushnumber(tag); + lua_pushstring(event); + do_unprotectedrun(luaI_gettagmethod, 2, 1); + return put_luaObjectonTop(); } - -/* -** Open file, generate opcode and execute global statement. Return 0 on -** success or non 0 on error. -*/ -int lua_dofile (char *filename) +lua_Object lua_settagmethod (int tag, char *event) { - int status; - int c; - FILE *f = lua_openfile(filename); - if (f == NULL) - return 2; - c = fgetc(f); - ungetc(c, f); - if (c == ID_CHUNK) { - f = freopen(filename, "rb", f); /* set binary mode */ - status = luaI_undump(f); - } - else { - if (c == '#') - while ((c=fgetc(f)) != '\n') /* skip first line */; - status = do_protectedmain(); - } - lua_closefile(); - return status; + TObject newmethod; + checkCparams(1); + newmethod = *(--top); + lua_pushnumber(tag); + lua_pushstring(event); + *top = newmethod; incr_top; + do_unprotectedrun(luaI_settagmethod, 3, 1); + return put_luaObjectonTop(); } -/* -** Generate opcode stored on string and execute global statement. Return 0 on -** success or non 0 on error. -*/ -int lua_dostring (char *str) +lua_Object lua_seterrormethod (void) { - int status; - if (str == NULL) - return 1; - lua_openstring(str); - status = do_protectedmain(); - lua_closestring(); - return status; -} - - -/* -** API: set a function as a fallback -*/ -lua_Object lua_setfallback (char *name, lua_CFunction fallback) -{ - adjustC(1); /* one slot for the pseudo-function */ - stack[CLS_current.base].tag = LUA_T_CFUNCTION; - stack[CLS_current.base].value.f = luaI_setfallback; - lua_pushstring(name); - lua_pushcfunction(fallback); - if (do_protectedrun(1) == 0) - return (Ref(top-1)); - else - return LUA_NOOBJECT; + checkCparams(1); + do_unprotectedrun(luaI_seterrormethod, 1, 1); + return put_luaObjectonTop(); } @@ -598,12 +668,11 @@ lua_Object lua_setfallback (char *name, lua_CFunction fallback) ** API: receives on the stack the table and the index. ** returns the value. */ -lua_Object lua_getsubscript (void) +lua_Object lua_gettable (void) { - adjustC(2); + checkCparams(2); pushsubscript(); - CLS_current.base++; /* incorporate object in the stack */ - return (Ref(top-1)); + return put_luaObjectonTop(); } @@ -633,13 +702,25 @@ void lua_endblock (void) adjustC(0); } +void lua_settag (int tag) +{ + checkCparams(1); + luaI_settag(tag, --top); +} + /* ** API: receives on the stack the table, the index, and the new value. */ -void lua_storesubscript (void) +void lua_settable (void) { - adjustC(3); - storesubscript(); + checkCparams(3); + storesubscript(top-3, 1); +} + +void lua_rawsettable (void) +{ + checkCparams(3); + storesubscript(top-3, 0); } /* @@ -647,40 +728,59 @@ void lua_storesubscript (void) */ lua_Object lua_createtable (void) { - adjustC(0); - avalue(top) = lua_createarray(0); - tag(top) = LUA_T_ARRAY; - incr_top; - CLS_current.base++; /* incorporate object in the stack */ - return Ref(top-1); + TObject o; + avalue(&o) = lua_createarray(0); + ttype(&o) = LUA_T_ARRAY; + return put_luaObject(&o); } /* ** Get a parameter, returning the object handle or LUA_NOOBJECT on error. ** 'number' must be 1 to get the first parameter. */ -lua_Object lua_getparam (int number) +lua_Object lua_lua2C (int number) +{ + if (number <= 0 || number > CLS_current.num) return LUA_NOOBJECT; + /* Ref(stack+(CLS_current.lua2C+number-1)) == + stack+(CLS_current.lua2C+number-1)-stack+1 == */ + return CLS_current.lua2C+number; +} + +int lua_isnil (lua_Object o) +{ + return (o!= LUA_NOOBJECT) && (ttype(Address(o)) == LUA_T_NIL); +} + +int lua_istable (lua_Object o) +{ + return (o!= LUA_NOOBJECT) && (ttype(Address(o)) == LUA_T_ARRAY); +} + +int lua_isuserdata (lua_Object o) { - if (number <= 0 || number > CLS_current.num) return LUA_NOOBJECT; - /* Ref(stack+(CLS_current.base-CLS_current.num+number-1)) == - stack+(CLS_current.base-CLS_current.num+number-1)-stack+1 == */ - return CLS_current.base-CLS_current.num+number; + return (o!= LUA_NOOBJECT) && (ttype(Address(o)) == LUA_T_USERDATA); } -int lua_isnumber (lua_Object object) +int lua_iscfunction (lua_Object o) { - return (object != LUA_NOOBJECT) && (tonumber(Address(object)) == 0); + int t = lua_tag(o); + return (t == LUA_T_CMARK) || (t == LUA_T_CFUNCTION); } -int lua_isstring (lua_Object object) +int lua_isnumber (lua_Object o) { - int t = lua_type(object); + return (o!= LUA_NOOBJECT) && (tonumber(Address(o)) == 0); +} + +int lua_isstring (lua_Object o) +{ + int t = lua_tag(o); return (t == LUA_T_STRING) || (t == LUA_T_NUMBER); } -int lua_isfunction (lua_Object object) +int lua_isfunction (lua_Object o) { - int t = lua_type(object); + int t = lua_tag(o); return (t == LUA_T_FUNCTION) || (t == LUA_T_CFUNCTION) || (t == LUA_T_MARK) || (t == LUA_T_CMARK); } @@ -700,57 +800,44 @@ real lua_getnumber (lua_Object object) */ char *lua_getstring (lua_Object object) { - if (object == LUA_NOOBJECT) return NULL; - if (tostring (Address(object))) return NULL; - else return (svalue(Address(object))); + if (object == LUA_NOOBJECT || tostring (Address(object))) + return NULL; + else return (svalue(Address(object))); } -/* -** Given an object handle, return its cfuntion pointer. On error, return NULL. -*/ -lua_CFunction lua_getcfunction (lua_Object object) + +void *lua_getuserdata (lua_Object object) { - if (object == LUA_NOOBJECT || ((tag(Address(object)) != LUA_T_CFUNCTION) && - (tag(Address(object)) != LUA_T_CMARK))) - return NULL; - else return (fvalue(Address(object))); + if (object == LUA_NOOBJECT || ttype(Address(object)) != LUA_T_USERDATA) + return NULL; + else return tsvalue(Address(object))->u.v; } + /* -** Given an object handle, return its user data. On error, return NULL. +** Given an object handle, return its cfuntion pointer. On error, return NULL. */ -void *lua_getuserdata (lua_Object object) +lua_CFunction lua_getcfunction (lua_Object object) { - if (object == LUA_NOOBJECT || tag(Address(object)) < LUA_T_USERDATA) + if (object == LUA_NOOBJECT || ((ttype(Address(object)) != LUA_T_CFUNCTION) && + (ttype(Address(object)) != LUA_T_CMARK))) return NULL; - else return (uvalue(Address(object))); + else return (fvalue(Address(object))); } lua_Object lua_getref (int ref) { - Object *o = luaI_getref(ref); + TObject *o = luaI_getref(ref); if (o == NULL) return LUA_NOOBJECT; - adjustC(0); - luaI_pushobject(o); - CLS_current.base++; /* incorporate object in the stack */ - return Ref(top-1); -} - - -void lua_pushref (int ref) -{ - Object *o = luaI_getref(ref); - if (o == NULL) - lua_error("access to invalid (possibly garbage collected) reference"); - luaI_pushobject(o); + return put_luaObject(o); } int lua_ref (int lock) { - adjustC(1); + checkCparams(1); return luaI_ref(--top, lock); } @@ -761,20 +848,50 @@ int lua_ref (int lock) */ lua_Object lua_getglobal (char *name) { - adjustC(0); - getglobal(luaI_findsymbolbyname(name)); - CLS_current.base++; /* incorporate object in the stack */ - return Ref(top-1); + getglobal(luaI_findsymbolbyname(name)); + return put_luaObjectonTop(); +} + + +lua_Object lua_rawgetglobal (char *name) +{ + return put_luaObject(&lua_table[luaI_findsymbolbyname(name)].object); } + /* ** Store top of the stack at a global variable array field. */ -void lua_storeglobal (char *name) +static void setglobal (Word n) +{ + TObject *oldvalue = &lua_table[n].object; + TObject *im = luaI_getimbyObj(oldvalue, IM_SETGLOBAL); + if (ttype(im) == LUA_T_NIL) /* default behavior */ + s_object(n) = *(--top); + else { + TObject newvalue = *(top-1); + ttype(top-1) = LUA_T_STRING; + tsvalue(top-1) = lua_table[n].varname; + *top = *oldvalue; + incr_top; + *top = newvalue; + incr_top; + callIM(im, 3, 0); + } +} + + +void lua_setglobal (char *name) { - Word n = luaI_findsymbolbyname(name); - adjustC(1); - s_object(n) = *(--top); + checkCparams(1); + setglobal(luaI_findsymbolbyname(name)); +} + +void lua_rawsetglobal (char *name) +{ + Word n = luaI_findsymbolbyname(name); + checkCparams(1); + s_object(n) = *(--top); } /* @@ -782,60 +899,59 @@ void lua_storeglobal (char *name) */ void lua_pushnil (void) { - tag(top) = LUA_T_NIL; - incr_top; + ttype(top) = LUA_T_NIL; + incr_top; } /* -** Push an object (tag=number) to stack. +** Push an object (ttype=number) to stack. */ void lua_pushnumber (real n) { - tag(top) = LUA_T_NUMBER; nvalue(top) = n; + ttype(top) = LUA_T_NUMBER; nvalue(top) = n; incr_top; } /* -** Push an object (tag=string) to stack. +** Push an object (ttype=string) to stack. */ void lua_pushstring (char *s) { if (s == NULL) - tag(top) = LUA_T_NIL; + ttype(top) = LUA_T_NIL; else { tsvalue(top) = lua_createstring(s); - tag(top) = LUA_T_STRING; + ttype(top) = LUA_T_STRING; } incr_top; } -/*>>>>>>>>>#undef lua_pushliteral -void lua_pushliteral(char *s) { lua_pushstring(s); }*/ + /* -** Push an object (tag=cfunction) to stack. +** Push an object (ttype=cfunction) to stack. */ void lua_pushcfunction (lua_CFunction fn) { - tag(top) = LUA_T_CFUNCTION; fvalue(top) = fn; + ttype(top) = LUA_T_CFUNCTION; fvalue(top) = fn; incr_top; } -/* -** Push an object (tag=userdata) to stack. -*/ + + void lua_pushusertag (void *u, int tag) { - if (tag < LUA_T_USERDATA) - lua_error("invalid tag in `lua_pushusertag'"); - tag(top) = tag; uvalue(top) = u; - incr_top; + if (tag < 0 && tag != LUA_ANYTAG) + luaI_realtag(tag); /* error if tag is not valid */ + tsvalue(top) = luaI_createudata(u, tag); + ttype(top) = LUA_T_USERDATA; + incr_top; } /* ** Push an object on the stack. */ -void luaI_pushobject (Object *o) +void luaI_pushobject (TObject *o) { *top = *o; incr_top; @@ -847,78 +963,102 @@ void luaI_pushobject (Object *o) void lua_pushobject (lua_Object o) { if (o == LUA_NOOBJECT) - lua_error("attempt to push a NOOBJECT"); + lua_error("API error - attempt to push a NOOBJECT"); *top = *Address(o); - if (tag(top) == LUA_T_MARK) tag(top) = LUA_T_FUNCTION; - else if (tag(top) == LUA_T_CMARK) tag(top) = LUA_T_CFUNCTION; + if (ttype(top) == LUA_T_MARK) ttype(top) = LUA_T_FUNCTION; + else if (ttype(top) == LUA_T_CMARK) ttype(top) = LUA_T_CFUNCTION; incr_top; } -int lua_type (lua_Object o) +int lua_tag (lua_Object lo) { - if (o == LUA_NOOBJECT) - return LUA_T_NIL; - else - return tag(Address(o)); + if (lo == LUA_NOOBJECT) return LUA_T_NIL; + else { + TObject *o = Address(lo); + lua_Type t = ttype(o); + if (t == LUA_T_USERDATA) + return o->value.ts->tag; + else if (t == LUA_T_ARRAY) + return o->value.a->htag; + else return t; + } } -void luaI_gcFB (Object *o) +void luaI_gcIM (TObject *o) { - *top = *o; - incr_top; - callFB(FB_GC); + TObject *im = luaI_getimbyObj(o, IM_GC); + if (ttype(im) != LUA_T_NIL) { + *top = *o; + incr_top; + callIM(im, 1, 0); + } +} + + +static void call_binTM (IMS event, char *msg) +{ + TObject *im = luaI_getimbyObj(top-2, event); /* try first operand */ + if (ttype(im) == LUA_T_NIL) { + im = luaI_getimbyObj(top-1, event); /* try second operand */ + if (ttype(im) == LUA_T_NIL) { + im = luaI_getim(0, event); /* try a 'global' i.m. */ + if (ttype(im) == LUA_T_NIL) + lua_error(msg); + } + } + lua_pushstring(luaI_eventname[event]); + callIM(im, 3, 1); } -static void call_arith (char *op) +static void call_arith (IMS event) { - lua_pushstring(op); - callFB(FB_ARITH); + call_binTM(event, "unexpected type at arithmetic operation"); } -static void comparison (lua_Type tag_less, lua_Type tag_equal, - lua_Type tag_great, char *op) + +static void comparison (lua_Type ttype_less, lua_Type ttype_equal, + lua_Type ttype_great, IMS op) { - Object *l = top-2; - Object *r = top-1; + TObject *l = top-2; + TObject *r = top-1; int result; - if (tag(l) == LUA_T_NUMBER && tag(r) == LUA_T_NUMBER) + if (ttype(l) == LUA_T_NUMBER && ttype(r) == LUA_T_NUMBER) result = (nvalue(l) < nvalue(r)) ? -1 : (nvalue(l) == nvalue(r)) ? 0 : 1; - else if (tostring(l) || tostring(r)) - { - lua_pushstring(op); - callFB(FB_ORDER); + else if (ttype(l) == LUA_T_STRING && ttype(r) == LUA_T_STRING) + result = strcmp(svalue(l), svalue(r)); + else { + call_binTM(op, "unexpected type at comparison"); return; } - else - result = strcmp(svalue(l), svalue(r)); top--; nvalue(top-1) = 1; - tag(top-1) = (result < 0) ? tag_less : (result == 0) ? tag_equal : tag_great; + ttype(top-1) = (result < 0) ? ttype_less : + (result == 0) ? ttype_equal : ttype_great; } static void adjust_varargs (StkId first_extra_arg) { - Object arg; - Object *firstelem = stack+first_extra_arg; + TObject arg; + TObject *firstelem = stack+first_extra_arg; int nvararg = top-firstelem; int i; if (nvararg < 0) nvararg = 0; avalue(&arg) = lua_createarray(nvararg+1); /* +1 for field 'n' */ - tag(&arg) = LUA_T_ARRAY; + ttype(&arg) = LUA_T_ARRAY; for (i=0; itag = LUA_T_FUNCTION; + top->ttype = LUA_T_FUNCTION; top->value.tf = f; incr_top; } @@ -1013,10 +1153,10 @@ static StkId lua_execute (Byte *pc, StkId base) case PUSHSELF: { - Object receiver = *(top-1); + TObject receiver = *(top-1); Word w; get_word(w,pc); - tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w]; + ttype(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w]; incr_top; pushsubscript(); *top = receiver; @@ -1037,47 +1177,32 @@ static StkId lua_execute (Byte *pc, StkId base) { Word w; get_word(w,pc); - s_object(w) = *(--top); + setglobal(w); } break; case STOREINDEXED0: - storesubscript(); + storesubscript(top-3, 1); break; - case STOREINDEXED: - { - int n = *pc++; - if (tag(top-3-n) != LUA_T_ARRAY) - { - lua_checkstack(top+2); - *(top+1) = *(top-1); - *(top) = *(top-2-n); - *(top-1) = *(top-3-n); - top += 2; - callFB(FB_SETTABLE); - } - else - { - Object *h = lua_hashdefine (avalue(top-3-n), top-2-n); - *h = *(top-1); - top--; - } + case STOREINDEXED: { + int n = *pc++; + storesubscript(top-3-n, 2); + break; } - break; case STORELIST0: case STORELIST: { int m, n; - Object *arr; + TObject *arr; if (opcode == STORELIST0) m = 0; else m = *(pc++) * FIELDS_PER_FLUSH; n = *(pc++); arr = top-n-1; while (n) { - tag(top) = LUA_T_NUMBER; nvalue(top) = n+m; + ttype(top) = LUA_T_NUMBER; nvalue(top) = n+m; *(lua_hashdefine (avalue(arr), top)) = *(top-1); top--; n--; @@ -1085,15 +1210,15 @@ static StkId lua_execute (Byte *pc, StkId base) } break; - case STORERECORD: + case STORERECORD: /* opcode obsolete: supersed by STOREMAP */ { int n = *(pc++); - Object *arr = top-n-1; + TObject *arr = top-n-1; while (n) { Word w; get_word(w,pc); - tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w]; + ttype(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w]; *(lua_hashdefine (avalue(arr), top)) = *(top-1); top--; n--; @@ -1101,13 +1226,25 @@ static StkId lua_execute (Byte *pc, StkId base) } break; + case STOREMAP: { + int n = *(pc++); + TObject *arr = top-(2*n)-1; + while (n--) { + *(lua_hashdefine (avalue(arr), top-2)) = *(top-1); + top-=2; + } + } + break; + case ADJUST0: adjust_top(base); break; - case ADJUST: - adjust_top(base + *(pc++)); + case ADJUST: { + StkId newtop = base + *(pc++); + adjust_top(newtop); break; + } case VARARGS: adjust_varargs(base + *(pc++)); @@ -1118,7 +1255,7 @@ static StkId lua_execute (Byte *pc, StkId base) Word size; get_word(size,pc); avalue(top) = lua_createarray(size); - tag(top) = LUA_T_ARRAY; + ttype(top) = LUA_T_ARRAY; incr_top; } break; @@ -1127,33 +1264,33 @@ static StkId lua_execute (Byte *pc, StkId base) { int res = lua_equalObj(top-2, top-1); --top; - tag(top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; + ttype(top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; nvalue(top-1) = 1; } break; case LTOP: - comparison(LUA_T_NUMBER, LUA_T_NIL, LUA_T_NIL, "lt"); + comparison(LUA_T_NUMBER, LUA_T_NIL, LUA_T_NIL, IM_LT); break; case LEOP: - comparison(LUA_T_NUMBER, LUA_T_NUMBER, LUA_T_NIL, "le"); + comparison(LUA_T_NUMBER, LUA_T_NUMBER, LUA_T_NIL, IM_LE); break; case GTOP: - comparison(LUA_T_NIL, LUA_T_NIL, LUA_T_NUMBER, "gt"); + comparison(LUA_T_NIL, LUA_T_NIL, LUA_T_NUMBER, IM_GT); break; case GEOP: - comparison(LUA_T_NIL, LUA_T_NUMBER, LUA_T_NUMBER, "ge"); + comparison(LUA_T_NIL, LUA_T_NUMBER, LUA_T_NUMBER, IM_GE); break; case ADDOP: { - Object *l = top-2; - Object *r = top-1; + TObject *l = top-2; + TObject *r = top-1; if (tonumber(r) || tonumber(l)) - call_arith("add"); + call_arith(IM_ADD); else { nvalue(l) += nvalue(r); @@ -1164,10 +1301,10 @@ static StkId lua_execute (Byte *pc, StkId base) case SUBOP: { - Object *l = top-2; - Object *r = top-1; + TObject *l = top-2; + TObject *r = top-1; if (tonumber(r) || tonumber(l)) - call_arith("sub"); + call_arith(IM_SUB); else { nvalue(l) -= nvalue(r); @@ -1178,10 +1315,10 @@ static StkId lua_execute (Byte *pc, StkId base) case MULTOP: { - Object *l = top-2; - Object *r = top-1; + TObject *l = top-2; + TObject *r = top-1; if (tonumber(r) || tonumber(l)) - call_arith("mul"); + call_arith(IM_MUL); else { nvalue(l) *= nvalue(r); @@ -1192,10 +1329,10 @@ static StkId lua_execute (Byte *pc, StkId base) case DIVOP: { - Object *l = top-2; - Object *r = top-1; + TObject *l = top-2; + TObject *r = top-1; if (tonumber(r) || tonumber(l)) - call_arith("div"); + call_arith(IM_DIV); else { nvalue(l) /= nvalue(r); @@ -1205,36 +1342,34 @@ static StkId lua_execute (Byte *pc, StkId base) break; case POWOP: - call_arith("pow"); + call_arith(IM_POW); break; - case CONCOP: - { - Object *l = top-2; - Object *r = top-1; - if (tostring(r) || tostring(l)) - callFB(FB_CONCAT); - else - { - tsvalue(l) = lua_createstring (lua_strconc(svalue(l),svalue(r))); - --top; - } + case CONCOP: { + TObject *l = top-2; + TObject *r = top-1; + if (tostring(l) || tostring(r)) + call_binTM(IM_CONCAT, "unexpected type for concatenation"); + else { + tsvalue(l) = lua_createstring(lua_strconc(svalue(l),svalue(r))); + --top; + } } break; case MINUSOP: if (tonumber(top-1)) { - tag(top) = LUA_T_NIL; + ttype(top) = LUA_T_NIL; incr_top; - call_arith("unm"); + call_arith(IM_UNM); } else nvalue(top-1) = - nvalue(top-1); break; case NOTOP: - tag(top-1) = (tag(top-1) == LUA_T_NIL) ? LUA_T_NUMBER : LUA_T_NIL; + ttype(top-1) = (ttype(top-1) == LUA_T_NIL) ? LUA_T_NUMBER : LUA_T_NIL; nvalue(top-1) = 1; break; @@ -1242,15 +1377,15 @@ static StkId lua_execute (Byte *pc, StkId base) { Word w; get_word(w,pc); - if (tag(top-1) != LUA_T_NIL) pc += w; + if (ttype(top-1) != LUA_T_NIL) pc += w; } break; - case ONFJMP: + case ONFJMP: { Word w; get_word(w,pc); - if (tag(top-1) == LUA_T_NIL) pc += w; + if (ttype(top-1) == LUA_T_NIL) pc += w; } break; @@ -1275,7 +1410,7 @@ static StkId lua_execute (Byte *pc, StkId base) Word w; get_word(w,pc); top--; - if (tag(top) == LUA_T_NIL) pc += w; + if (ttype(top) == LUA_T_NIL) pc += w; } break; @@ -1284,7 +1419,7 @@ static StkId lua_execute (Byte *pc, StkId base) Word w; get_word(w,pc); top--; - if (tag(top) == LUA_T_NIL) pc -= w; + if (ttype(top) == LUA_T_NIL) pc -= w; } break; @@ -1309,12 +1444,12 @@ static StkId lua_execute (Byte *pc, StkId base) { Word line; get_word(line,pc); - if ((stack+base-1)->tag != LUA_T_LINE) + if ((stack+base-1)->ttype != LUA_T_LINE) { /* open space for LINE value */ open_stack((top-stack)-base); base++; - (stack+base-1)->tag = LUA_T_LINE; + (stack+base-1)->ttype = LUA_T_LINE; } (stack+base-1)->value.i = line; if (lua_linehook) @@ -1328,3 +1463,16 @@ static StkId lua_execute (Byte *pc, StkId base) } } + +#if COMPAT2_5 +/* +** API: set a function as a fallback +*/ +lua_Object lua_setfallback (char *name, lua_CFunction fallback) +{ + lua_pushstring(name); + lua_pushcfunction(fallback); + do_unprotectedrun(luaI_setfallback, 2, 1); + return put_luaObjectonTop(); +} +#endif diff --git a/src/opcode.h b/src/opcode.h index 381efbc..0b63de9 100644 --- a/src/opcode.h +++ b/src/opcode.h @@ -1,6 +1,6 @@ /* ** TeCGraf - PUC-Rio -** $Id: opcode.h,v 3.24 1996/11/01 12:46:59 roberto Exp $ +** $Id: opcode.h,v 3.34 1997/06/16 16:50:22 roberto Exp $ */ #ifndef opcode_h @@ -14,6 +14,28 @@ #define FIELDS_PER_FLUSH 40 +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER LUA_T" +*/ +typedef enum +{ + LUA_T_NIL = -9, + LUA_T_NUMBER = -8, + LUA_T_STRING = -7, + LUA_T_ARRAY = -6, /* array==table */ + LUA_T_FUNCTION = -5, + LUA_T_CFUNCTION= -4, + LUA_T_MARK = -3, + LUA_T_CMARK = -2, + LUA_T_LINE = -1, + LUA_T_USERDATA = 0 +} lua_Type; + +#define NUM_TYPES 10 + + +extern char *luaI_typenames[]; typedef enum { /* name parm before after side effect @@ -38,7 +60,7 @@ PUSHLOCAL6,/* - LOC[6] */ PUSHLOCAL7,/* - LOC[7] */ PUSHLOCAL8,/* - LOC[8] */ PUSHLOCAL9,/* - LOC[9] */ -PUSHLOCAL,/* w - LOC[w] */ +PUSHLOCAL,/* b - LOC[b] */ PUSHGLOBAL,/* w - VAR[w] */ PUSHINDEXED,/* i t t[i] */ PUSHSELF,/* w t t t[STR[w]] */ @@ -52,14 +74,14 @@ STORELOCAL6,/* x - LOC[6]=x */ STORELOCAL7,/* x - LOC[7]=x */ STORELOCAL8,/* x - LOC[8]=x */ STORELOCAL9,/* x - LOC[9]=x */ -STORELOCAL,/* w x - LOC[w]=x */ +STORELOCAL,/* b x - LOC[b]=x */ STOREGLOBAL,/* w x - VAR[w]=x */ STOREINDEXED0,/* v i t - t[i]=v */ STOREINDEXED,/* b v a_b...a_1 i t a_b...a_1 i t t[i]=v */ -STORELIST0,/* w v_w...v_1 t - t[i]=v_i */ -STORELIST,/* w n v_w...v_1 t - t[i+n*FPF]=v_i */ -STORERECORD,/* n - w_n...w_1 v_n...v_1 t - t[STR[w_i]]=v_i */ +STORELIST0,/* b v_b...v_1 t - t[i]=v_i */ +STORELIST,/* b c v_b...v_1 t - t[i+c*FPF]=v_i */ +STORERECORD,/* b + w_b...w_1 v_b...v_1 t - t[STR[w_i]]=v_i */ ADJUST0,/* - - TOP=BASE */ ADJUST,/* b - - TOP=BASE+b */ CREATEARRAY,/* w - newarray(size = w) */ @@ -76,19 +98,19 @@ POWOP,/* y x x^y */ CONCOP,/* y x x..y */ MINUSOP,/* x -x */ NOTOP,/* x (x==nil)? 1 : nil */ -ONTJMP,/* w x - (x!=nil)? PC+=w */ -ONFJMP,/* w x - (x==nil)? PC+=w */ +ONTJMP,/* w x - (x!=nil)? PC+=w */ +ONFJMP,/* w x - (x==nil)? PC+=w */ JMP,/* w - - PC+=w */ -UPJMP,/* w - - PC-=w */ -IFFJMP,/* w x - (x==nil)? PC+=w */ +UPJMP,/* w - - PC-=w */ +IFFJMP,/* w x - (x==nil)? PC+=w */ IFFUPJMP,/* w x - (x==nil)? PC-=w */ POP,/* x - */ -CALLFUNC,/* n m v_n...v_1 f r_m...r_1 f(v1,...,v_n) */ +CALLFUNC,/* b c v_b...v_1 f r_c...r_1 f(v1,...,v_b) */ RETCODE0, RETCODE,/* b - - */ SETLINE,/* w - - LINE=w */ -VARARGS/* b v_n...v_1 {v_1...v_n;n=n} */ - +VARARGS,/* b v_b...v_1 {v_1...v_b;n=b} */ +STOREMAP/* b v_b k_b ...v_1 k_1 t - t[k_i]=v_i */ } OpCode; @@ -102,29 +124,27 @@ typedef union TaggedString *ts; TFunc *tf; struct Hash *a; - void *u; int i; } Value; -typedef struct Object +typedef struct TObject { - lua_Type tag; + lua_Type ttype; Value value; -} Object; +} TObject; /* Macros to access structure members */ -#define tag(o) ((o)->tag) +#define ttype(o) ((o)->ttype) #define nvalue(o) ((o)->value.n) #define svalue(o) ((o)->value.ts->str) #define tsvalue(o) ((o)->value.ts) #define avalue(o) ((o)->value.a) #define fvalue(o) ((o)->value.f) -#define uvalue(o) ((o)->value.u) /* Macros to access symbol table */ #define s_object(i) (lua_table[i].object) -#define s_tag(i) (tag(&s_object(i))) +#define s_ttype(i) (ttype(&s_object(i))) #define s_nvalue(i) (nvalue(&s_object(i))) #define s_svalue(i) (svalue(&s_object(i))) #define s_tsvalue(i) (tsvalue(&s_object(i))) @@ -141,10 +161,11 @@ typedef struct Object /* Exported functions */ void lua_parse (TFunc *tf); /* from "lua.stx" module */ void luaI_codedebugline (int line); /* from "lua.stx" module */ -void lua_travstack (int (*fn)(Object *)); -Object *luaI_Address (lua_Object o); -void luaI_pushobject (Object *o); -void luaI_gcFB (Object *o); +void lua_travstack (int (*fn)(TObject *)); +TObject *luaI_Address (lua_Object o); +void luaI_pushobject (TObject *o); +void luaI_gcIM (TObject *o); int luaI_dorun (TFunc *tf); +int lua_domain (void); #endif diff --git a/src/parser.c b/src/parser.c index c91ee00..ad5f8d6 100644 --- a/src/parser.c +++ b/src/parser.c @@ -10,14 +10,14 @@ static char luaY_sccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; #define YYPREFIX "luaY_" #line 2 "lua.stx" -char *rcs_luastx = "$Id: parser.c,v 1.1 1996/11/21 16:11:40 lhf Exp $"; +char *rcs_luastx = "$Id: parser.c,v 1.1 1997/06/30 18:59:03 lhf Exp $"; #include #include #include #include "luadebug.h" -#include "mem.h" +#include "luamem.h" #include "lex.h" #include "opcode.h" #include "hash.h" @@ -60,8 +60,6 @@ static TaggedString *localvar[MAXLOCALS]; /* store local variable names */ static int nlocalvar=0; /* number of local variables */ #define MAXFIELDS FIELDS_PER_FLUSH*2 -static Word fields[MAXFIELDS]; /* fieldnames to be flushed */ -static int nfields=0; int lua_debug = 0; @@ -113,22 +111,11 @@ static void code_word_at (Byte *p, int n) memcpy(p, &w, sizeof(Word)); } -static void push_field (Word name) -{ - if (nfields < MAXFIELDS) - fields[nfields++] = name; - else - luaY_error ("too many fields in nested constructors"); -} - static void flush_record (int n) { - int i; if (n == 0) return; - code_byte(STORERECORD); + code_byte(STOREMAP); code_byte(n); - for (i=0; i= 0 && f <= (float)MAX_WORD && (float)(i=(Word)f) == f) { + /* f has an (short) integer value */ if (i <= 2) code_byte(PUSH0 + i); else if (i <= 255) { @@ -418,7 +416,7 @@ void lua_parse (TFunc *tf) } -#line 414 "lua.stx" +#line 412 "lua.stx" typedef union { int vInt; @@ -429,7 +427,7 @@ typedef union TFunc *pFunc; TaggedString *pTStr; } YYSTYPE; -#line 433 "y.tab.c" +#line 431 "y.tab.c" #define WRONGTOKEN 257 #define NIL 258 #define IF 259 @@ -467,8 +465,9 @@ short luaY_lhs[] = { -1, 38, 5, 39, 5, 40, 37, 4, 8, 8, 7, 7, 2, 2, 3, 41, 3, 17, 17, 18, 18, 19, 19, 42, 9, 9, 14, 14, 43, 43, 12, - 12, 13, 13, 44, 15, 15, 16, 16, 6, 6, - 20, 20, 20, 21, 29, 10, 10, 11, 11, + 12, 13, 13, 44, 45, 45, 15, 15, 16, 16, + 6, 6, 20, 20, 20, 21, 29, 10, 10, 11, + 11, }; short luaY_len[] = { 2, 2, 0, 3, 2, 3, 1, 3, 5, 0, 3, @@ -479,113 +478,114 @@ short luaY_len[] = { 2, 0, 5, 0, 5, 0, 4, 2, 1, 3, 3, 1, 0, 1, 1, 0, 4, 0, 1, 1, 3, 1, 1, 0, 3, 2, 0, 2, 0, 1, 0, - 2, 1, 3, 3, 0, 2, 1, 3, 1, 3, - 1, 4, 3, 1, 1, 1, 3, 0, 2, + 2, 1, 3, 3, 3, 1, 0, 2, 1, 3, + 1, 3, 1, 4, 3, 1, 1, 1, 3, 0, + 2, }; short luaY_defred[] = { 2, - 0, 0, 0, 14, 16, 0, 0, 0, 94, 19, - 0, 0, 0, 91, 1, 0, 4, 0, 48, 46, - 47, 0, 0, 0, 49, 29, 95, 0, 0, 44, - 0, 0, 24, 0, 0, 0, 0, 96, 0, 0, + 0, 0, 0, 14, 16, 0, 0, 0, 96, 19, + 0, 0, 0, 93, 1, 0, 4, 0, 48, 46, + 47, 0, 0, 0, 49, 29, 97, 0, 0, 44, + 0, 0, 24, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 57, 61, 12, 3, 0, 0, 0, 0, 0, 0, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 27, 65, 0, 0, 20, 0, - 5, 0, 0, 0, 0, 0, 59, 0, 93, 30, + 5, 0, 0, 0, 0, 0, 59, 0, 95, 30, 24, 51, 53, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, - 0, 82, 28, 0, 0, 0, 0, 97, 72, 71, - 0, 0, 69, 7, 60, 92, 28, 0, 0, 0, - 56, 0, 75, 0, 0, 86, 24, 0, 25, 0, - 0, 24, 0, 0, 0, 0, 0, 0, 83, 0, - 74, 0, 28, 17, 10, 0, 70, 24, 0, 0, - 77, 0, 0, 8, 22, 0, 13, 81, 15, 28, - 24, 28, 0, 23, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, + 0, 0, 82, 0, 28, 0, 0, 0, 0, 99, + 72, 71, 0, 0, 69, 7, 60, 94, 28, 0, + 0, 0, 56, 0, 75, 0, 0, 88, 0, 24, + 0, 25, 0, 0, 24, 0, 0, 0, 0, 85, + 86, 83, 0, 74, 0, 0, 28, 17, 10, 0, + 70, 24, 0, 0, 77, 0, 0, 8, 22, 0, + 13, 81, 15, 28, 24, 28, 0, 23, }; short luaY_dgoto[] = { 1, - 91, 34, 35, 25, 26, 11, 46, 12, 107, 39, - 79, 161, 108, 151, 109, 110, 121, 122, 123, 27, + 91, 34, 35, 25, 26, 11, 46, 12, 108, 39, + 79, 165, 109, 154, 110, 111, 123, 124, 125, 27, 14, 41, 81, 2, 15, 16, 49, 17, 28, 73, - 115, 37, 160, 32, 33, 74, 30, 128, 129, 31, - 116, 134, 133, 112, + 117, 37, 164, 32, 33, 74, 30, 130, 131, 31, + 118, 136, 135, 113, 114, }; short luaY_sindex[] = { 0, - 0, 332, -38, 0, 0, -38, -239, -223, 0, 0, - -23, 17, 0, 0, 0, 3, 0, 137, 0, 0, - 0, -38, -38, -38, 0, 0, 0, 137, 547, 0, - -25, -38, 0, 3, 45, 0, 212, 0, -22, 0, - 52, 140, -38, -223, -38, 0, 0, 0, 0, -166, - -38, -154, 40, 40, 102, 0, 0, 0, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -34, 481, -130, 0, 0, 0, -38, -129, 0, -194, - 0, -123, 45, 0, -17, 103, 0, 753, 0, 0, - 0, 0, 0, -30, -30, -30, -30, -30, -30, 95, - 11, 11, 40, 40, 40, 97, 41, 123, 0, 124, - 212, 0, 0, -38, -59, -38, 45, 0, 0, 0, - 128, 131, 0, 0, 0, 0, 0, -38, -38, -38, - 0, -97, 0, 120, -38, 0, 0, 212, 0, 3, - 0, 0, -194, -183, 118, 118, 212, 97, 0, -97, - 0, 212, 0, 0, 0, -85, 0, 0, -38, -82, - 0, 123, -80, 0, 0, 1105, 0, 0, 0, 0, - 0, 0, -183, 0, + 0, 288, -34, 0, 0, -34, -238, -223, 0, 0, + -6, 22, 0, 0, 0, 14, 0, 150, 0, 0, + 0, -34, -34, -34, 0, 0, 0, 150, 547, 0, + -46, -34, 0, 14, 34, 0, 212, 0, -5, 0, + 39, 156, -34, -223, -34, 0, 0, 0, 0, -194, + -34, -193, -4, -4, 48, 0, 0, 0, -34, -34, + -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, + -38, 481, -173, 0, 0, 0, -34, -146, 0, -234, + 0, -138, 34, 0, -15, 96, 0, 753, 0, 0, + 0, 0, 0, -30, -30, -30, -30, -30, -30, -20, + -12, -12, -4, -4, -4, 0, -34, 16, 95, 0, + 98, 212, 0, 82, 0, -34, 328, -34, 34, 0, + 0, 0, 103, 101, 0, 0, 0, 0, 0, -34, + -34, 1181, 0, -91, 0, 92, -34, 0, -34, 0, + 212, 0, 14, 0, 0, -234, -233, 118, 118, 0, + 0, 0, -91, 0, 212, 212, 0, 0, 0, -105, + 0, 0, -34, -103, 0, 95, -101, 0, 0, 1105, + 0, 0, 0, 0, 0, 0, -233, 0, }; short luaY_rindex[] = { 0, - 0, 191, 69, 0, 0, 173, 0, 0, 0, 0, - 0, 69, 150, 0, 0, 146, 0, -36, 0, 0, - 0, 69, 69, 69, 0, 0, 0, 1, 0, 0, - 0, 69, 0, 47, 461, 436, 0, 0, 197, 130, - 0, 0, 69, 0, -33, 0, 0, 0, 0, 0, - 69, 0, 24, 59, 1181, 0, 0, 0, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - -50, 0, 0, 0, 0, 0, 69, 0, 0, 152, - 0, 0, 311, -21, 0, 0, 0, 0, 0, 0, + 0, 169, 52, 0, 0, 173, 0, 0, 0, 0, + 0, 52, 508, 0, 0, 146, 0, -36, 0, 0, + 0, 52, 52, 52, 0, 0, 0, 1, 0, 0, + 0, 52, 0, 47, 461, 436, 0, 0, 197, 76, + 0, 0, 52, 0, -32, 0, 0, 0, 0, 0, + 52, 0, 24, 59, 1195, 0, 0, 0, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + -27, 0, 0, 0, 0, 0, 52, 0, 0, 129, + 0, 0, 311, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 746, 776, 799, 821, 844, 866, 505, - 383, 410, 88, 112, 359, 1174, 0, 74, 0, -40, - -26, 0, 0, 69, -230, 69, 921, 0, 0, 0, - 0, 160, 0, 0, 0, 0, 0, 69, 69, 69, - 0, 77, 0, 78, -9, 0, 0, 939, 0, 289, - 474, 0, 0, -60, 894, 1137, -16, 0, 0, 89, - 0, -10, 0, 0, 0, 0, 0, 0, 69, 0, - 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -60, 0, + 383, 410, 88, 112, 359, 1174, 52, 0, 51, 0, + -40, -10, 0, 0, 0, 52, -153, 52, 921, 0, + 0, 0, 0, 144, 0, 0, 0, 0, 0, 52, + 52, 0, 0, 62, 0, 64, -26, 0, 52, 0, + 939, 0, 682, 474, 0, 0, -77, 894, 1137, 0, + 0, 0, 66, 0, 13, -18, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 51, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -77, 0, }; short luaY_gindex[] = { 0, - -31, 171, 85, -2, 48, 0, 0, 0, 0, 0, - 0, 0, 67, 0, 0, 0, 0, 0, 75, 8, - 0, 0, 0, 0, 104, 107, -29, 0, 12, -61, - 0, 1260, 50, 0, 0, 0, 213, 0, 0, 0, - 0, 0, -107, 94, + 53, 147, -23, 3, 134, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 49, 6, + 0, 0, 0, 0, 81, 83, -16, 0, 8, -70, + 0, 1445, 27, 0, 0, 0, 187, 0, 0, 0, + 0, 0, -108, 67, 0, }; -#define YYTABLESIZE 1462 -short luaY_table[] = { 10, - 45, 24, 136, 58, 75, 24, 22, 62, 85, 13, - 22, 68, 66, 18, 67, 40, 69, 87, 78, 42, - 44, 78, 90, 43, 95, 92, 93, 84, 52, 127, - 26, 26, 87, 88, 38, 26, 26, 43, 77, 90, - 58, 45, 45, 45, 45, 45, 11, 45, 88, 79, - 9, 84, 68, 36, 168, 85, 45, 69, 50, 45, - 45, 48, 45, 70, 43, 43, 43, 43, 43, 95, - 43, 55, 55, 51, 85, 153, 119, 158, 159, 120, - 156, 137, 43, 43, 78, 43, 58, 39, 76, 55, - 36, 80, 36, 45, 45, 144, 165, 71, 87, 50, - 50, 50, 50, 50, 70, 50, 154, 87, 84, 172, - 155, 40, 10, 55, 88, 79, 43, 50, 50, 89, - 50, 163, 13, 58, 36, 45, 18, 83, 39, 39, - 39, 39, 39, 70, 39, 114, 68, 66, 171, 67, - 173, 69, 90, 125, 118, 11, 39, 39, 43, 39, - 124, 50, 40, 40, 40, 40, 40, 130, 40, 68, - 66, 117, 67, 141, 69, 131, 132, 135, 142, 6, - 40, 40, 62, 40, 143, 95, 148, 62, 150, 61, - 39, 164, 52, 50, 167, 52, 169, 95, 70, 95, - 26, 55, 67, 89, 50, 95, 98, 82, 78, 3, - 68, 79, 76, 4, 40, 5, 21, 95, 6, 7, - 89, 70, 39, 80, 9, 86, 162, 157, 139, 19, - 95, 140, 174, 19, 47, 149, 0, 51, 0, 0, - 51, 62, 0, 20, 21, 9, 40, 20, 21, 106, - 95, 0, 0, 0, 23, 0, 0, 0, 23, 0, - 65, 0, 0, 68, 66, 98, 67, 0, 69, 45, +#define YYTABLESIZE 1608 +short luaY_table[] = { 107, + 45, 24, 138, 58, 10, 24, 22, 13, 62, 18, + 22, 68, 66, 40, 67, 42, 69, 75, 78, 83, + 129, 68, 66, 43, 67, 84, 69, 162, 163, 68, + 52, 87, 79, 89, 69, 38, 121, 44, 78, 122, + 58, 45, 45, 45, 45, 45, 11, 45, 89, 84, + 9, 85, 107, 119, 43, 77, 90, 172, 50, 45, + 45, 45, 45, 70, 43, 43, 43, 43, 43, 157, + 43, 90, 48, 70, 160, 51, 71, 76, 80, 87, + 89, 70, 43, 43, 78, 43, 58, 39, 90, 70, + 55, 169, 116, 45, 45, 55, 55, 87, 79, 50, + 50, 50, 50, 50, 176, 50, 84, 26, 26, 92, + 93, 40, 26, 26, 89, 6, 43, 50, 50, 10, + 50, 97, 13, 58, 18, 45, 159, 120, 39, 39, + 39, 39, 39, 97, 39, 126, 127, 90, 134, 36, + 133, 137, 139, 145, 146, 11, 39, 39, 43, 39, + 153, 50, 40, 40, 40, 40, 40, 55, 40, 68, + 66, 168, 67, 171, 69, 173, 97, 140, 26, 67, + 40, 40, 62, 40, 55, 78, 36, 62, 36, 61, + 39, 147, 151, 50, 68, 92, 79, 97, 76, 21, + 80, 86, 166, 158, 161, 52, 100, 142, 47, 143, + 152, 52, 92, 178, 40, 0, 0, 50, 0, 167, + 36, 70, 39, 82, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 19, 0, 0, 175, 0, 177, 0, + 0, 62, 97, 20, 21, 106, 40, 20, 21, 9, + 51, 0, 0, 0, 23, 0, 51, 0, 23, 0, + 65, 144, 0, 68, 66, 100, 67, 0, 69, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 62, 95, 61, 45, 45, 45, 45, 45, 45, + 45, 62, 0, 61, 45, 45, 45, 45, 45, 45, 45, 45, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 55, 0, 43, 43, 43, 43, 43, 43, 43, 43, 70, 0, 11, 11, 0, @@ -603,25 +603,25 @@ short luaY_table[] = { 10, 41, 0, 0, 37, 0, 37, 37, 37, 0, 0, 0, 0, 0, 62, 62, 64, 0, 0, 62, 62, 0, 37, 37, 0, 37, 0, 0, 0, 0, 0, - 38, 41, 38, 38, 38, 98, 0, 98, 98, 98, - 63, 98, 98, 98, 98, 98, 98, 0, 38, 38, - 98, 38, 0, 66, 0, 37, 64, 29, 29, 64, + 38, 41, 38, 38, 38, 100, 0, 100, 100, 100, + 63, 100, 100, 100, 100, 100, 100, 0, 38, 38, + 100, 38, 0, 66, 0, 37, 64, 29, 29, 64, 29, 0, 29, 41, 0, 0, 57, 58, 59, 60, 63, 64, 65, 0, 64, 29, 0, 29, 0, 0, 0, 63, 38, 0, 42, 0, 0, 37, 0, 0, 0, 0, 0, 0, 66, 29, 29, 66, 29, 63, 29, 0, 68, 66, 0, 67, 0, 69, 0, 29, 0, 0, 66, 29, 38, 29, 0, 0, 0, 0, - 62, 0, 61, 0, 0, 42, 0, 11, 42, 11, - 11, 11, 0, 11, 11, 11, 11, 11, 0, 0, - 0, 0, 11, 42, 42, 0, 42, 29, 0, 18, + 62, 0, 61, 0, 0, 42, 3, 97, 42, 0, + 4, 91, 5, 97, 0, 6, 7, 8, 0, 0, + 0, 9, 0, 42, 42, 97, 42, 29, 91, 18, 0, 18, 18, 18, 70, 18, 18, 18, 18, 18, - 18, 0, 0, 0, 18, 0, 0, 0, 68, 66, - 3, 67, 0, 69, 4, 0, 5, 42, 0, 6, - 7, 8, 0, 0, 0, 9, 62, 0, 61, 0, + 18, 0, 0, 0, 18, 0, 3, 0, 68, 66, + 4, 67, 5, 69, 0, 6, 7, 42, 97, 0, + 0, 9, 0, 0, 0, 0, 62, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, - 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, + 97, 0, 41, 41, 41, 41, 41, 41, 41, 41, 70, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, 38, 38, @@ -632,7 +632,7 @@ short luaY_table[] = { 10, 29, 29, 29, 29, 29, 29, 29, 0, 0, 0, 0, 63, 63, 0, 0, 0, 63, 63, 0, 0, 0, 0, 66, 0, 66, 66, 66, 0, 66, 66, - 66, 66, 66, 66, 113, 31, 0, 66, 29, 29, + 66, 66, 66, 66, 115, 31, 0, 66, 29, 29, 29, 29, 29, 29, 29, 57, 58, 59, 60, 63, 64, 65, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 34, 0, 0, 42, 42, @@ -642,7 +642,7 @@ short luaY_table[] = { 10, 0, 0, 62, 0, 61, 0, 34, 0, 0, 34, 32, 57, 58, 59, 60, 63, 64, 65, 0, 0, 0, 0, 0, 0, 34, 34, 0, 34, 31, 33, - 0, 0, 33, 35, 0, 126, 70, 0, 0, 0, + 0, 0, 33, 35, 0, 128, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, 0, 33, 32, 0, 0, 32, 36, 0, 0, 34, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 32, @@ -650,12 +650,12 @@ short luaY_table[] = { 10, 0, 33, 0, 52, 0, 0, 0, 0, 0, 0, 34, 0, 35, 35, 0, 35, 36, 0, 0, 36, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 99, 0, 0, 33, 36, 36, 0, 36, 0, 0, + 101, 0, 0, 33, 36, 36, 0, 36, 0, 0, 0, 0, 0, 0, 52, 0, 35, 52, 28, 0, - 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, - 0, 0, 52, 0, 0, 0, 0, 0, 36, 0, + 11, 0, 11, 11, 11, 32, 11, 11, 11, 11, + 11, 0, 52, 0, 0, 11, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 31, 31, 31, 31, 31, 31, @@ -675,66 +675,80 @@ short luaY_table[] = { 10, 36, 36, 36, 36, 36, 36, 68, 66, 0, 67, 0, 69, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 62, 0, 61, 52, 52, 52, - 0, 0, 0, 0, 0, 0, 0, 54, 0, 99, - 54, 99, 99, 99, 0, 99, 99, 99, 99, 99, - 99, 0, 0, 0, 99, 54, 0, 28, 70, 28, + 0, 0, 0, 0, 0, 0, 0, 54, 0, 101, + 54, 101, 101, 101, 0, 101, 101, 101, 101, 101, + 101, 0, 0, 0, 101, 54, 0, 28, 70, 28, 28, 28, 0, 28, 28, 28, 28, 28, 28, 0, - 0, 0, 28, 94, 0, 94, 94, 94, 94, 94, - 94, 0, 29, 29, 0, 29, 0, 29, 0, 54, - 0, 94, 94, 94, 0, 94, 0, 0, 0, 0, - 29, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 96, 0, 96, 96, 96, 96, 96, + 96, 0, 68, 66, 0, 67, 0, 69, 0, 54, + 0, 96, 96, 96, 86, 96, 29, 29, 0, 29, + 62, 29, 61, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 29, 0, 0, 0, + 0, 54, 0, 0, 96, 0, 0, 96, 0, 0, + 0, 0, 0, 150, 70, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 96, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 54, 29, 0, 94, 0, 0, 94, 0, 0, - 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, - 0, 53, 54, 0, 0, 0, 0, 0, 0, 0, - 0, 72, 0, 0, 0, 0, 94, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 88, 0, 0, 0, 0, 0, 0, 0, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, - 0, 0, 0, 138, 0, 0, 0, 0, 0, 57, - 58, 59, 60, 63, 64, 65, 0, 145, 146, 147, - 0, 0, 0, 0, 152, 54, 54, 54, 54, 54, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 58, 59, 60, 63, 64, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 0, - 54, 54, 54, 0, 0, 0, 0, 0, 166, 0, + 54, 54, 54, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 96, 96, + 96, 96, 96, 96, 96, 57, 58, 59, 60, 63, + 64, 65, 0, 0, 0, 0, 53, 54, 0, 29, + 29, 29, 29, 29, 29, 29, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, + 0, 0, 0, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 94, 94, - 94, 94, 94, 94, 94, 29, 29, 29, 29, 29, - 29, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, + 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 148, 149, 0, 0, 0, 0, + 0, 155, 0, 156, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 170, }; -short luaY_check[] = { 2, - 0, 40, 110, 40, 34, 40, 45, 41, 59, 2, - 45, 42, 43, 2, 45, 8, 47, 44, 59, 8, - 44, 44, 44, 0, 46, 57, 58, 44, 46, 91, - 261, 262, 59, 44, 274, 266, 267, 61, 61, 61, - 40, 41, 42, 43, 44, 45, 0, 47, 59, 59, - 274, 44, 42, 6, 162, 44, 40, 47, 0, 59, - 60, 59, 62, 94, 41, 42, 43, 44, 45, 91, - 47, 24, 123, 91, 125, 137, 271, 261, 262, 274, - 142, 113, 59, 60, 125, 62, 123, 0, 44, 123, - 43, 40, 45, 93, 94, 127, 158, 123, 125, 41, - 42, 43, 44, 45, 94, 47, 138, 274, 125, 171, - 140, 0, 115, 123, 125, 125, 93, 59, 60, 274, - 62, 153, 115, 123, 77, 125, 115, 43, 41, 42, - 43, 44, 45, 94, 47, 266, 42, 43, 170, 45, - 172, 47, 41, 41, 274, 0, 59, 60, 125, 62, - 274, 93, 41, 42, 43, 44, 45, 61, 47, 42, - 43, 77, 45, 116, 47, 125, 44, 44, 41, 40, - 59, 60, 0, 62, 44, 46, 274, 60, 59, 62, - 93, 267, 46, 125, 267, 46, 267, 58, 94, 40, - 0, 123, 41, 44, 58, 46, 0, 58, 125, 259, - 41, 125, 125, 263, 93, 265, 267, 58, 268, 269, - 61, 94, 125, 125, 274, 45, 150, 143, 115, 258, - 91, 115, 173, 258, 12, 132, -1, 91, -1, -1, - 91, 59, -1, 272, 273, 274, 125, 272, 273, 274, - 91, -1, -1, -1, 283, -1, -1, -1, 283, -1, - 281, -1, -1, 42, 43, 59, 45, -1, 47, 259, +short luaY_check[] = { 91, + 0, 40, 111, 40, 2, 40, 45, 2, 41, 2, + 45, 42, 43, 8, 45, 8, 47, 34, 59, 43, + 91, 42, 43, 0, 45, 44, 47, 261, 262, 42, + 46, 59, 59, 44, 47, 274, 271, 44, 44, 274, + 40, 41, 42, 43, 44, 45, 0, 47, 59, 44, + 274, 44, 91, 77, 61, 61, 44, 166, 0, 59, + 60, 40, 62, 94, 41, 42, 43, 44, 45, 140, + 47, 59, 59, 94, 145, 91, 123, 44, 40, 274, + 274, 94, 59, 60, 125, 62, 123, 0, 41, 94, + 123, 162, 266, 93, 94, 123, 123, 125, 125, 41, + 42, 43, 44, 45, 175, 47, 125, 261, 262, 57, + 58, 0, 266, 267, 125, 40, 93, 59, 60, 117, + 62, 46, 117, 123, 117, 125, 143, 274, 41, 42, + 43, 44, 45, 58, 47, 274, 41, 125, 44, 6, + 125, 44, 61, 41, 44, 0, 59, 60, 125, 62, + 59, 93, 41, 42, 43, 44, 45, 24, 47, 42, + 43, 267, 45, 267, 47, 267, 91, 115, 0, 41, + 59, 60, 0, 62, 123, 125, 43, 60, 45, 62, + 93, 129, 274, 125, 41, 44, 125, 46, 125, 267, + 125, 45, 153, 141, 146, 46, 0, 117, 12, 117, + 134, 46, 61, 177, 93, -1, -1, 58, -1, 157, + 77, 94, 125, 58, -1, -1, -1, -1, -1, 258, + -1, -1, -1, 258, -1, -1, 174, -1, 176, -1, + -1, 59, 91, 272, 273, 274, 125, 272, 273, 274, + 91, -1, -1, -1, 283, -1, 91, -1, 283, -1, + 281, 118, -1, 42, 43, 59, 45, -1, 47, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 60, 123, 62, 274, 275, 276, 277, 278, 279, + 270, 60, -1, 62, 274, 275, 276, 277, 278, 279, 280, 281, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, -1, 123, -1, 274, 275, 276, 277, 278, 279, 280, 281, 94, -1, 261, 262, -1, @@ -761,16 +775,16 @@ short luaY_check[] = { 2, -1, -1, -1, -1, 41, 42, 43, 44, 45, 59, 47, -1, 42, 43, -1, 45, -1, 47, -1, 94, -1, -1, 59, 60, 125, 62, -1, -1, -1, -1, - 60, -1, 62, -1, -1, 41, -1, 259, 44, 261, - 262, 263, -1, 265, 266, 267, 268, 269, -1, -1, - -1, -1, 274, 59, 60, -1, 62, 94, -1, 259, + 60, -1, 62, -1, -1, 41, 259, 40, 44, -1, + 263, 44, 265, 46, -1, 268, 269, 270, -1, -1, + -1, 274, -1, 59, 60, 58, 62, 94, 61, 259, -1, 261, 262, 263, 94, 265, 266, 267, 268, 269, - 270, -1, -1, -1, 274, -1, -1, -1, 42, 43, - 259, 45, -1, 47, 263, -1, 265, 93, -1, 268, - 269, 270, -1, -1, -1, 274, 60, -1, 62, -1, + 270, -1, -1, -1, 274, -1, 259, -1, 42, 43, + 263, 45, 265, 47, -1, 268, 269, 93, 91, -1, + -1, 274, -1, -1, -1, -1, 60, -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 125, - -1, -1, 274, 275, 276, 277, 278, 279, 280, 281, + 123, -1, 274, 275, 276, 277, 278, 279, 280, 281, 94, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, -1, -1, -1, 274, 275, 276, 277, 278, 279, 280, 281, -1, -1, -1, -1, 259, 260, @@ -801,8 +815,8 @@ short luaY_check[] = { 2, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, 0, -1, -1, 125, 59, 60, -1, 62, -1, -1, -1, -1, -1, -1, 41, -1, 93, 44, 0, -1, - -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, - -1, -1, 59, -1, -1, -1, -1, -1, 93, -1, + 259, -1, 261, 262, 263, 125, 265, 266, 267, 268, + 269, -1, 59, -1, -1, 274, -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, 93, -1, -1, -1, @@ -830,30 +844,44 @@ short luaY_check[] = { 2, 262, 263, -1, 265, 266, 267, 268, 269, 270, -1, -1, -1, 274, 40, -1, 42, 43, 44, 45, 46, 47, -1, 42, 43, -1, 45, -1, 47, -1, 93, - -1, 58, 59, 60, -1, 62, -1, -1, -1, -1, - 60, -1, 62, -1, -1, -1, -1, -1, -1, -1, + -1, 58, 59, 60, 61, 62, 42, 43, -1, 45, + 60, 47, 62, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 60, -1, 62, -1, -1, -1, + -1, 125, -1, -1, 91, -1, -1, 94, -1, -1, + -1, -1, -1, 93, 94, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 94, -1, + -1, -1, -1, -1, -1, -1, 123, -1, 125, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 125, 3, -1, 91, -1, -1, 94, -1, -1, - -1, -1, -1, -1, 94, -1, -1, -1, -1, -1, - -1, 22, 23, -1, -1, -1, -1, -1, -1, -1, - -1, 32, -1, -1, -1, -1, 123, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 51, -1, -1, -1, -1, -1, -1, -1, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, -1, - -1, -1, -1, 114, -1, -1, -1, -1, -1, 275, - 276, 277, 278, 279, 280, 281, -1, 128, 129, 130, - -1, -1, -1, -1, 135, 259, 260, 261, 262, 263, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 275, + 276, 277, 278, 279, 280, 281, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, -1, -1, -1, - 274, 275, 276, -1, -1, -1, -1, -1, 159, -1, + 274, 275, 276, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 275, 276, + -1, -1, -1, -1, -1, -1, -1, 3, 275, 276, 277, 278, 279, 280, 281, 275, 276, 277, 278, 279, - 280, 281, + 280, 281, -1, -1, -1, -1, 22, 23, -1, 275, + 276, 277, 278, 279, 280, 281, 32, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 51, -1, -1, -1, -1, + -1, -1, -1, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 107, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 130, 131, -1, -1, -1, -1, + -1, 137, -1, 139, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 163, }; #define YYFINAL 1 #ifndef YYDEBUG @@ -958,7 +986,9 @@ char *luaY_rule[] = { "ffieldlist : ffieldlist1 lastcomma", "ffieldlist1 : ffield", "ffieldlist1 : ffieldlist1 ',' ffield", -"ffield : NAME '=' expr1", +"ffield : ffieldkey '=' expr1", +"ffieldkey : '[' expr1 ']'", +"ffieldkey : NAME", "lfieldlist :", "lfieldlist : lfieldlist1 lastcomma", "lfieldlist1 : expr1", @@ -1139,7 +1169,7 @@ luaY_reduce: switch (luaY_n) { case 5: -#line 470 "lua.stx" +#line 468 "lua.stx" { code_byte(PUSHFUNCTION); code_code(luaY_vsp[0].pFunc); @@ -1147,28 +1177,26 @@ case 5: } break; case 6: -#line 477 "lua.stx" +#line 475 "lua.stx" { luaY_val.vLong =luaY_vsp[0].vLong; init_func(); } break; case 7: -#line 479 "lua.stx" +#line 477 "lua.stx" { - code_byte(PUSHSTRING); - code_word(luaI_findconstant(luaY_vsp[0].pTStr)); + code_constant(luaY_vsp[0].pTStr); luaY_val.vLong = 0; /* indexed variable */ init_func(); add_localvar(luaI_createfixedstring("self")); } break; case 8: -#line 489 "lua.stx" +#line 486 "lua.stx" { codereturn(); luaY_val.pFunc = new(TFunc); luaI_initTFunc(luaY_val.pFunc); luaY_val.pFunc->size = pc; luaY_val.pFunc->code = newvector(pc, Byte); - luaY_val.pFunc->fileName = lua_parsedfile; luaY_val.pFunc->lineDefined = luaY_vsp[-3].vInt; memcpy(luaY_val.pFunc->code, basepc, pc*sizeof(Byte)); if (lua_debug) @@ -1182,15 +1210,15 @@ case 8: } break; case 13: -#line 516 "lua.stx" +#line 512 "lua.stx" { codeIf(luaY_vsp[-4].vLong, luaY_vsp[-2].vLong); } break; case 14: -#line 518 "lua.stx" +#line 514 "lua.stx" {luaY_val.vLong=pc;} break; case 15: -#line 519 "lua.stx" +#line 515 "lua.stx" { basepc[luaY_vsp[-3].vLong] = IFFJMP; code_word_at(basepc+luaY_vsp[-3].vLong+1, pc - (luaY_vsp[-3].vLong + sizeof(Word)+1)); @@ -1199,18 +1227,18 @@ case 15: } break; case 16: -#line 526 "lua.stx" +#line 522 "lua.stx" {luaY_val.vLong=pc;} break; case 17: -#line 527 "lua.stx" +#line 523 "lua.stx" { basepc[luaY_vsp[0].vLong] = IFFUPJMP; code_word_at(basepc+luaY_vsp[0].vLong+1, pc - (luaY_vsp[-4].vLong)); } break; case 18: -#line 533 "lua.stx" +#line 529 "lua.stx" { { int i; @@ -1222,22 +1250,26 @@ case 18: } } break; +case 19: +#line 539 "lua.stx" +{;} +break; case 20: -#line 545 "lua.stx" +#line 541 "lua.stx" { nlocalvar += luaY_vsp[-1].vInt; adjust_mult_assign(luaY_vsp[-1].vInt, luaY_vsp[0].vInt, 0); } break; case 23: -#line 553 "lua.stx" +#line 549 "lua.stx" { codeIf(luaY_vsp[-3].vLong, luaY_vsp[-1].vLong); } break; case 24: -#line 556 "lua.stx" +#line 552 "lua.stx" {luaY_val.vInt = nlocalvar;} break; case 25: -#line 557 "lua.stx" +#line 553 "lua.stx" { if (nlocalvar != luaY_vsp[-2].vInt) { @@ -1251,14 +1283,14 @@ case 25: } break; case 27: -#line 572 "lua.stx" +#line 568 "lua.stx" { adjust_functioncall(luaY_vsp[-1].vLong, MULT_RET); codereturn(); } break; case 28: -#line 579 "lua.stx" +#line 575 "lua.stx" { luaY_val.vLong = pc; code_byte(0); /* open space */ @@ -1266,103 +1298,102 @@ case 28: } break; case 29: -#line 586 "lua.stx" +#line 582 "lua.stx" { adjust_functioncall(luaY_vsp[0].vLong, 1); } break; case 30: -#line 589 "lua.stx" +#line 585 "lua.stx" { luaY_val.vLong = luaY_vsp[-1].vLong; } break; case 31: -#line 590 "lua.stx" +#line 586 "lua.stx" { code_byte(EQOP); luaY_val.vLong = 0; } break; case 32: -#line 591 "lua.stx" +#line 587 "lua.stx" { code_byte(LTOP); luaY_val.vLong = 0; } break; case 33: -#line 592 "lua.stx" +#line 588 "lua.stx" { code_byte(GTOP); luaY_val.vLong = 0; } break; case 34: -#line 593 "lua.stx" +#line 589 "lua.stx" { code_byte(EQOP); code_byte(NOTOP); luaY_val.vLong = 0; } break; case 35: -#line 594 "lua.stx" +#line 590 "lua.stx" { code_byte(LEOP); luaY_val.vLong = 0; } break; case 36: -#line 595 "lua.stx" +#line 591 "lua.stx" { code_byte(GEOP); luaY_val.vLong = 0; } break; case 37: -#line 596 "lua.stx" +#line 592 "lua.stx" { code_byte(ADDOP); luaY_val.vLong = 0; } break; case 38: -#line 597 "lua.stx" +#line 593 "lua.stx" { code_byte(SUBOP); luaY_val.vLong = 0; } break; case 39: -#line 598 "lua.stx" +#line 594 "lua.stx" { code_byte(MULTOP); luaY_val.vLong = 0; } break; case 40: -#line 599 "lua.stx" +#line 595 "lua.stx" { code_byte(DIVOP); luaY_val.vLong = 0; } break; case 41: -#line 600 "lua.stx" +#line 596 "lua.stx" { code_byte(POWOP); luaY_val.vLong = 0; } break; case 42: -#line 601 "lua.stx" +#line 597 "lua.stx" { code_byte(CONCOP); luaY_val.vLong = 0; } break; case 43: -#line 602 "lua.stx" +#line 598 "lua.stx" { code_byte(MINUSOP); luaY_val.vLong = 0;} break; case 44: -#line 603 "lua.stx" +#line 599 "lua.stx" { luaY_val.vLong = 0; } break; case 45: -#line 604 "lua.stx" +#line 600 "lua.stx" { luaY_val.vLong = 0;} break; case 46: -#line 605 "lua.stx" +#line 601 "lua.stx" { code_number(luaY_vsp[0].vFloat); luaY_val.vLong = 0; } break; case 47: -#line 607 "lua.stx" +#line 603 "lua.stx" { - code_byte(PUSHSTRING); - code_word(luaY_vsp[0].vWord); - luaY_val.vLong = 0; + code_string(luaY_vsp[0].vWord); + luaY_val.vLong = 0; } break; case 48: -#line 612 "lua.stx" +#line 607 "lua.stx" {code_byte(PUSHNIL); luaY_val.vLong = 0; } break; case 49: -#line 613 "lua.stx" +#line 608 "lua.stx" { luaY_val.vLong = luaY_vsp[0].vLong; } break; case 50: -#line 614 "lua.stx" +#line 609 "lua.stx" { code_byte(NOTOP); luaY_val.vLong = 0;} break; case 51: -#line 615 "lua.stx" +#line 610 "lua.stx" {code_byte(POP); } break; case 52: -#line 616 "lua.stx" +#line 611 "lua.stx" { basepc[luaY_vsp[-2].vLong] = ONFJMP; code_word_at(basepc+luaY_vsp[-2].vLong+1, pc - (luaY_vsp[-2].vLong + sizeof(Word)+1)); @@ -1370,11 +1401,11 @@ case 52: } break; case 53: -#line 621 "lua.stx" +#line 616 "lua.stx" {code_byte(POP); } break; case 54: -#line 622 "lua.stx" +#line 617 "lua.stx" { basepc[luaY_vsp[-2].vLong] = ONTJMP; code_word_at(basepc+luaY_vsp[-2].vLong+1, pc - (luaY_vsp[-2].vLong + sizeof(Word)+1)); @@ -1382,20 +1413,20 @@ case 54: } break; case 55: -#line 630 "lua.stx" +#line 625 "lua.stx" { code_byte(CREATEARRAY); luaY_val.vLong = pc; code_word(0); } break; case 56: -#line 635 "lua.stx" +#line 630 "lua.stx" { code_word_at(basepc+luaY_vsp[-3].vLong, luaY_vsp[-1].vInt); } break; case 57: -#line 641 "lua.stx" +#line 636 "lua.stx" { code_byte(CALLFUNC); code_byte(luaY_vsp[-1].vInt+luaY_vsp[0].vInt); @@ -1404,11 +1435,11 @@ case 57: } break; case 58: -#line 649 "lua.stx" +#line 644 "lua.stx" { luaY_val.vInt = 0; } break; case 59: -#line 651 "lua.stx" +#line 646 "lua.stx" { code_byte(PUSHSELF); code_word(luaI_findconstant(luaY_vsp[0].pTStr)); @@ -1416,31 +1447,31 @@ case 59: } break; case 60: -#line 659 "lua.stx" +#line 654 "lua.stx" { luaY_val.vInt = adjust_functioncall(luaY_vsp[-1].vLong, 1); } break; case 61: -#line 660 "lua.stx" +#line 655 "lua.stx" { luaY_val.vInt = 1; } break; case 62: -#line 663 "lua.stx" +#line 658 "lua.stx" { luaY_val.vLong = 0; } break; case 63: -#line 664 "lua.stx" +#line 659 "lua.stx" { luaY_val.vLong = luaY_vsp[0].vLong; } break; case 64: -#line 667 "lua.stx" +#line 662 "lua.stx" { if (luaY_vsp[0].vLong != 0) luaY_val.vLong = luaY_vsp[0].vLong; else luaY_val.vLong = -1; } break; case 65: -#line 668 "lua.stx" +#line 663 "lua.stx" { luaY_val.vLong = adjust_functioncall(luaY_vsp[-1].vLong, 1); } break; case 66: -#line 669 "lua.stx" +#line 664 "lua.stx" { if (luaY_vsp[0].vLong == 0) luaY_val.vLong = -(luaY_vsp[-1].vLong + 1); /* -length */ else @@ -1451,19 +1482,19 @@ case 66: } break; case 67: -#line 679 "lua.stx" +#line 674 "lua.stx" { luaY_val.vInt = close_parlist(0); } break; case 68: -#line 680 "lua.stx" +#line 675 "lua.stx" { luaY_val.vInt = close_parlist(luaY_vsp[0].vInt); } break; case 69: -#line 683 "lua.stx" +#line 678 "lua.stx" { luaY_val.vInt = luaY_vsp[0].vInt; } break; case 70: -#line 685 "lua.stx" +#line 680 "lua.stx" { if (luaY_vsp[-2].vInt) lua_error("invalid parameter list"); @@ -1471,113 +1502,110 @@ case 70: } break; case 71: -#line 692 "lua.stx" +#line 687 "lua.stx" { add_localvar(luaY_vsp[0].pTStr); luaY_val.vInt = 0; } break; case 72: -#line 693 "lua.stx" +#line 688 "lua.stx" { luaY_val.vInt = 1; } break; case 73: -#line 697 "lua.stx" +#line 692 "lua.stx" { flush_list(luaY_vsp[0].vInt/FIELDS_PER_FLUSH, luaY_vsp[0].vInt%FIELDS_PER_FLUSH); } break; case 74: -#line 699 "lua.stx" +#line 694 "lua.stx" { luaY_val.vInt = luaY_vsp[-2].vInt+luaY_vsp[0].vInt; } break; case 75: -#line 701 "lua.stx" +#line 696 "lua.stx" { luaY_val.vInt = luaY_vsp[-1].vInt; flush_record(luaY_vsp[-1].vInt%FIELDS_PER_FLUSH); } break; case 76: -#line 705 "lua.stx" +#line 700 "lua.stx" { luaY_val.vInt = 0; } break; case 77: -#line 707 "lua.stx" +#line 702 "lua.stx" { luaY_val.vInt = luaY_vsp[0].vInt; flush_record(luaY_vsp[0].vInt%FIELDS_PER_FLUSH); } break; case 80: -#line 714 "lua.stx" +#line 709 "lua.stx" { luaY_val.vInt = 0; } break; case 81: -#line 715 "lua.stx" +#line 710 "lua.stx" { luaY_val.vInt = luaY_vsp[-1].vInt; } break; case 82: -#line 718 "lua.stx" +#line 713 "lua.stx" {luaY_val.vInt=1;} break; case 83: -#line 720 "lua.stx" +#line 715 "lua.stx" { luaY_val.vInt=luaY_vsp[-2].vInt+1; if (luaY_val.vInt%FIELDS_PER_FLUSH == 0) flush_record(FIELDS_PER_FLUSH); } break; -case 84: -#line 727 "lua.stx" -{ - push_field(luaI_findconstant(luaY_vsp[-2].pTStr)); - } +case 86: +#line 725 "lua.stx" +{ code_constant(luaY_vsp[0].pTStr); } break; -case 85: -#line 732 "lua.stx" +case 87: +#line 728 "lua.stx" { luaY_val.vInt = 0; } break; -case 86: -#line 733 "lua.stx" +case 88: +#line 729 "lua.stx" { luaY_val.vInt = luaY_vsp[-1].vInt; } break; -case 87: -#line 736 "lua.stx" +case 89: +#line 732 "lua.stx" {luaY_val.vInt=1;} break; -case 88: -#line 738 "lua.stx" +case 90: +#line 734 "lua.stx" { luaY_val.vInt=luaY_vsp[-2].vInt+1; if (luaY_val.vInt%FIELDS_PER_FLUSH == 0) flush_list(luaY_val.vInt/FIELDS_PER_FLUSH - 1, FIELDS_PER_FLUSH); } break; -case 89: -#line 746 "lua.stx" +case 91: +#line 742 "lua.stx" { nvarbuffer = 0; add_varbuffer(luaY_vsp[0].vLong); luaY_val.vInt = (luaY_vsp[0].vLong == 0) ? 1 : 0; } break; -case 90: -#line 752 "lua.stx" +case 92: +#line 748 "lua.stx" { add_varbuffer(luaY_vsp[0].vLong); luaY_val.vInt = (luaY_vsp[0].vLong == 0) ? luaY_vsp[-2].vInt + 1 : luaY_vsp[-2].vInt; } break; -case 91: -#line 758 "lua.stx" +case 93: +#line 754 "lua.stx" { luaY_val.vLong = luaY_vsp[0].vLong; } break; -case 92: -#line 760 "lua.stx" +case 94: +#line 756 "lua.stx" { luaY_val.vLong = 0; /* indexed variable */ } break; -case 93: -#line 764 "lua.stx" +case 95: +#line 760 "lua.stx" { - code_byte(PUSHSTRING); - code_word(luaI_findconstant(luaY_vsp[0].pTStr)); - luaY_val.vLong = 0; /* indexed variable */ + code_constant(luaY_vsp[0].pTStr); + luaY_val.vLong = 0; /* indexed variable */ } break; -case 94: -#line 772 "lua.stx" +case 96: +#line 767 "lua.stx" { int local = lua_localname(luaY_vsp[0].pTStr); if (local == -1) /* global var */ @@ -1586,30 +1614,30 @@ case 94: luaY_val.vLong = -(local+1); /* return negative value */ } break; -case 95: -#line 781 "lua.stx" +case 97: +#line 776 "lua.stx" { lua_pushvar(luaY_vsp[0].vLong); } break; -case 96: -#line 784 "lua.stx" +case 98: +#line 779 "lua.stx" {store_localvar(luaY_vsp[0].pTStr, 0); luaY_val.vInt = 1;} break; -case 97: -#line 786 "lua.stx" +case 99: +#line 781 "lua.stx" { store_localvar(luaY_vsp[0].pTStr, luaY_vsp[-2].vInt); luaY_val.vInt = luaY_vsp[-2].vInt+1; } break; -case 98: -#line 792 "lua.stx" +case 100: +#line 787 "lua.stx" { luaY_val.vInt = 0; } break; -case 99: -#line 793 "lua.stx" +case 101: +#line 788 "lua.stx" { luaY_val.vInt = luaY_vsp[0].vLong; } break; -#line 1613 "y.tab.c" +#line 1641 "y.tab.c" } luaY_ssp -= luaY_m; luaY_state = *luaY_ssp; diff --git a/src/table.c b/src/table.c index b2e60a3..6f24ca9 100644 --- a/src/table.c +++ b/src/table.c @@ -3,9 +3,11 @@ ** Module to control static tables */ -char *rcs_table="$Id: table.c,v 2.58 1996/11/01 12:47:45 roberto Exp $"; +char *rcs_table="$Id: table.c,v 2.72 1997/06/17 18:09:31 roberto Exp $"; -#include "mem.h" +#include "luamem.h" +#include "auxlib.h" +#include "func.h" #include "opcode.h" #include "tree.h" #include "hash.h" @@ -27,49 +29,14 @@ Word lua_nconstant = 0; static Long lua_maxconstant = 0; -#define GARBAGE_BLOCK 50 - -static void lua_nextvar (void); - -/* -** Internal functions -*/ -static struct { - char *name; - lua_CFunction func; -} int_funcs[] = { - {"assert", luaI_assert}, - {"call", luaI_call}, - {"dofile", lua_internaldofile}, - {"dostring", lua_internaldostring}, - {"error", luaI_error}, - {"getglobal", luaI_getglobal}, - {"next", lua_next}, - {"nextvar", lua_nextvar}, - {"print", luaI_print}, - {"setfallback", luaI_setfallback}, - {"setglobal", luaI_setglobal}, - {"tonumber", lua_obj2number}, - {"tostring", luaI_tostring}, - {"type", luaI_type} -}; - -#define INTFUNCSIZE (sizeof(int_funcs)/sizeof(int_funcs[0])) +#define GARBAGE_BLOCK 100 void luaI_initsymbol (void) { - int i; - Word n; lua_maxsymbol = BUFFER_BLOCK; lua_table = newvector(lua_maxsymbol, Symbol); - for (i=0; ivarindex == NOT_USED) + if (t->u.s.varindex == NOT_USED) { if (lua_ntable == lua_maxsymbol) lua_maxsymbol = growvector(&lua_table, lua_maxsymbol, Symbol, symbolEM, MAX_WORD); - t->varindex = lua_ntable; + t->u.s.varindex = lua_ntable; lua_table[lua_ntable].varname = t; - s_tag(lua_ntable) = LUA_T_NIL; + s_ttype(lua_ntable) = LUA_T_NIL; lua_ntable++; } - return t->varindex; + return t->u.s.varindex; } @@ -118,16 +85,16 @@ Word luaI_findsymbolbyname (char *name) */ Word luaI_findconstant (TaggedString *t) { - if (t->constindex == NOT_USED) + if (t->u.s.constindex == NOT_USED) { if (lua_nconstant == lua_maxconstant) lua_maxconstant = growvector(&lua_constant, lua_maxconstant, TaggedString *, constantEM, MAX_WORD); - t->constindex = lua_nconstant; + t->u.s.constindex = lua_nconstant; lua_constant[lua_nconstant] = t; lua_nconstant++; } - return t->constindex; + return t->u.s.constindex; } @@ -145,10 +112,16 @@ TaggedString *luaI_createfixedstring (char *name) } +int luaI_globaldefined (char *name) +{ + return ttype(&lua_table[luaI_findsymbolbyname(name)].object) != LUA_T_NIL; +} + + /* ** Traverse symbol table objects */ -static char *lua_travsymbol (int (*fn)(Object *)) +static char *lua_travsymbol (int (*fn)(TObject *)) { Word i; for (i=0; imarked) + if (ttype(o) == LUA_T_USERDATA || + (ttype(o) == LUA_T_STRING && !tsvalue(o)->marked)) tsvalue(o)->marked = 1; - else if (tag(o) == LUA_T_ARRAY) + else if (ttype(o) == LUA_T_ARRAY) lua_hashmark (avalue(o)); - else if ((o->tag == LUA_T_FUNCTION || o->tag == LUA_T_MARK) + else if ((o->ttype == LUA_T_FUNCTION || o->ttype == LUA_T_MARK) && !o->value.tf->marked) o->value.tf->marked = 1; return 0; @@ -176,11 +150,11 @@ int lua_markobject (Object *o) /* * returns 0 if the object is going to be (garbage) collected */ -int luaI_ismarked (Object *o) +int luaI_ismarked (TObject *o) { - switch (o->tag) + switch (o->ttype) { - case LUA_T_STRING: + case LUA_T_STRING: case LUA_T_USERDATA: return o->value.ts->marked; case LUA_T_FUNCTION: return o->value.tf->marked; @@ -192,76 +166,90 @@ int luaI_ismarked (Object *o) } +static void call_nilIM (void) +{ /* signals end of garbage collection */ + TObject t; + ttype(&t) = LUA_T_NIL; + luaI_gcIM(&t); /* end of list */ +} + /* ** Garbage collection. ** Delete all unused strings and arrays. */ -Long luaI_collectgarbage (void) +static long gc_block = GARBAGE_BLOCK; +static long gc_nentity = 0; /* total of strings, arrays, etc */ + +static void markall (void) { - Long recovered = 0; lua_travstack(lua_markobject); /* mark stack objects */ lua_travsymbol(lua_markobject); /* mark symbol table objects */ luaI_travlock(lua_markobject); /* mark locked objects */ luaI_travfallbacks(lua_markobject); /* mark fallbacks */ +} + + +long lua_collectgarbage (long limit) +{ + long recovered = 0; + Hash *freetable; + TaggedString *freestr; + TFunc *freefunc; + markall(); luaI_invalidaterefs(); - recovered += lua_strcollector(); - recovered += lua_hashcollector(); - recovered += luaI_funccollector(); + freetable = luaI_hashcollector(&recovered); + freestr = luaI_strcollector(&recovered); + freefunc = luaI_funccollector(&recovered); + gc_nentity -= recovered; + gc_block = (limit == 0) ? 2*(gc_block-recovered) : gc_nentity+limit; + luaI_hashcallIM(freetable); + luaI_strcallIM(freestr); + call_nilIM(); + luaI_hashfree(freetable); + luaI_strfree(freestr); + luaI_funcfree(freefunc); return recovered; } + void lua_pack (void) { - static unsigned long block = GARBAGE_BLOCK; - static unsigned long nentity = 0; /* total of strings, arrays, etc */ - unsigned long recovered = 0; - if (nentity++ < block) return; - recovered = luaI_collectgarbage(); - block = 2*(block-recovered); - nentity -= recovered; + if (++gc_nentity >= gc_block) + lua_collectgarbage(0); } /* ** Internal function: return next global variable */ -static void lua_nextvar (void) +void luaI_nextvar (void) { - Word next; - lua_Object o = lua_getparam(1); - if (o == LUA_NOOBJECT) - lua_error("too few arguments to function `nextvar'"); - if (lua_getparam(2) != LUA_NOOBJECT) - lua_error("too many arguments to function `nextvar'"); - if (lua_isnil(o)) - next = 0; - else if (!lua_isstring(o)) - { - lua_error("incorrect argument to function `nextvar'"); - return; /* to avoid warnings */ - } - else - next = luaI_findsymbolbyname(lua_getstring(o)) + 1; - while (next < lua_ntable && s_tag(next) == LUA_T_NIL) next++; - if (next < lua_ntable) - { - lua_pushstring(lua_table[next].varname->str); - luaI_pushobject(&s_object(next)); - } + Word next; + if (lua_isnil(lua_getparam(1))) + next = 0; + else + next = luaI_findsymbolbyname(luaL_check_string(1)) + 1; + while (next < lua_ntable && s_ttype(next) == LUA_T_NIL) + next++; + if (next < lua_ntable) { + lua_pushstring(lua_table[next].varname->str); + luaI_pushobject(&s_object(next)); + } } -static Object *functofind; -static int checkfunc (Object *o) +static TObject *functofind; +static int checkfunc (TObject *o) { - if (o->tag == LUA_T_FUNCTION) + if (o->ttype == LUA_T_FUNCTION) return - ((functofind->tag == LUA_T_FUNCTION || functofind->tag == LUA_T_MARK) + ((functofind->ttype == LUA_T_FUNCTION || functofind->ttype == LUA_T_MARK) && (functofind->value.tf == o->value.tf)); - if (o->tag == LUA_T_CFUNCTION) + if (o->ttype == LUA_T_CFUNCTION) return - ((functofind->tag == LUA_T_CFUNCTION || functofind->tag == LUA_T_CMARK) - && (functofind->value.f == o->value.f)); + ((functofind->ttype == LUA_T_CFUNCTION || + functofind->ttype == LUA_T_CMARK) && + (functofind->value.f == o->value.f)); return 0; } @@ -270,7 +258,7 @@ char *lua_getobjname (lua_Object o, char **name) { /* try to find a name for given function */ functofind = luaI_Address(o); if ((*name = luaI_travfallbacks(checkfunc)) != NULL) - return "fallback"; + return "tag-method"; else if ((*name = lua_travsymbol(checkfunc)) != NULL) return "global"; else return ""; diff --git a/src/table.h b/src/table.h index d7003c9..5a62852 100644 --- a/src/table.h +++ b/src/table.h @@ -1,7 +1,7 @@ /* ** Module to control static tables ** TeCGraf - PUC-Rio -** $Id: table.h,v 2.21 1996/04/22 18:00:37 roberto Exp $ +** $Id: table.h,v 2.25 1997/05/26 14:42:36 roberto Exp $ */ #ifndef table_h @@ -12,7 +12,7 @@ typedef struct { - Object object; + TObject object; TaggedString *varname; } Symbol; @@ -28,10 +28,11 @@ Word luaI_findsymbolbyname (char *name); Word luaI_findsymbol (TaggedString *t); Word luaI_findconstant (TaggedString *t); Word luaI_findconstantbyname (char *name); +int luaI_globaldefined (char *name); +void luaI_nextvar (void); TaggedString *luaI_createfixedstring (char *str); -int lua_markobject (Object *o); -int luaI_ismarked (Object *o); -Long luaI_collectgarbage (void); +int lua_markobject (TObject *o); +int luaI_ismarked (TObject *o); void lua_pack (void); diff --git a/src/tree.c b/src/tree.c index 8fbe420..6f3f2d4 100644 --- a/src/tree.c +++ b/src/tree.c @@ -3,17 +3,18 @@ ** TecCGraf - PUC-Rio */ -char *rcs_tree="$Id: tree.c,v 1.20 1996/03/14 15:56:26 roberto Exp $"; +char *rcs_tree="$Id: tree.c,v 1.28 1997/06/11 14:24:40 roberto Exp $"; #include -#include "mem.h" +#include "luamem.h" #include "lua.h" #include "tree.h" #include "lex.h" #include "hash.h" #include "table.h" +#include "fallback.h" #define NUM_HASHS 64 @@ -28,23 +29,43 @@ static int initialized = 0; static stringtable string_root[NUM_HASHS]; -static TaggedString EMPTY = {NOT_USED, NOT_USED, 0, 2, {0}}; +static TaggedString EMPTY = {LUA_T_STRING, NULL, {{NOT_USED, NOT_USED}}, + 0, 2, {0}}; -static unsigned long hash (char *str) +static unsigned long hash (char *s, int tag) { - unsigned long h = 0; - while (*str) - h = ((h<<5)-h)^(unsigned char)*(str++); + unsigned long h; + if (tag != LUA_T_STRING) + h = (unsigned long)s; + else { + h = 0; + while (*s) + h = ((h<<5)-h)^(unsigned char)*(s++); + } return h; } + +static void luaI_inittree (void) +{ + int i; + for (i=0; inuse = 0; for (i=0; isize; i++) - if (tb->hash[i] != NULL && tb->hash[i] != &EMPTY) - { + if (tb->hash[i] != NULL && tb->hash[i] != &EMPTY) { int h = tb->hash[i]->hash%newsize; while (newhash[h]) h = (h+1)%newsize; @@ -71,10 +91,30 @@ static void grow (stringtable *tb) tb->hash = newhash; } -static TaggedString *insert (char *str, stringtable *tb) + +static TaggedString *newone(char *buff, int tag, unsigned long h) +{ + TaggedString *ts; + if (tag == LUA_T_STRING) { + ts = (TaggedString *)luaI_malloc(sizeof(TaggedString)+strlen(buff)); + strcpy(ts->str, buff); + ts->u.s.varindex = ts->u.s.constindex = NOT_USED; + ts->tag = LUA_T_STRING; + } + else { + ts = (TaggedString *)luaI_malloc(sizeof(TaggedString)); + ts->u.v = buff; + ts->tag = tag == LUA_ANYTAG ? 0 : tag; + } + ts->marked = 0; + ts->hash = h; + return ts; +} + +static TaggedString *insert (char *buff, int tag, stringtable *tb) { TaggedString *ts; - unsigned long h = hash(str); + unsigned long h = hash(buff, tag); int i; int j = -1; if ((Long)tb->nuse*3 >= (Long)tb->size*2) @@ -84,12 +124,14 @@ static TaggedString *insert (char *str, stringtable *tb) grow(tb); } i = h%tb->size; - while (tb->hash[i]) + while ((ts = tb->hash[i]) != NULL) { - if (tb->hash[i] == &EMPTY) + if (ts == &EMPTY) j = i; - else if (strcmp(str, tb->hash[i]->str) == 0) - return tb->hash[i]; + else if ((ts->tag == LUA_T_STRING) ? + (tag == LUA_T_STRING && (strcmp(buff, ts->str) == 0)) : + ((tag == ts->tag || tag == LUA_ANYTAG) && buff == ts->u.v)) + return ts; i = (i+1)%tb->size; } /* not found */ @@ -98,27 +140,49 @@ static TaggedString *insert (char *str, stringtable *tb) i = j; else tb->nuse++; - ts = tb->hash[i] = (TaggedString *)luaI_malloc(sizeof(TaggedString)+strlen(str)); - strcpy(ts->str, str); - ts->marked = 0; - ts->hash = h; - ts->varindex = ts->constindex = NOT_USED; + ts = tb->hash[i] = newone(buff, tag, h); return ts; } -TaggedString *lua_createstring (char *str) +TaggedString *luaI_createudata (void *udata, int tag) { - return insert(str, &string_root[(unsigned)str[0]%NUM_HASHS]); + return insert(udata, tag, &string_root[(unsigned)udata%NUM_HASHS]); +} + +TaggedString *lua_createstring (char *str) +{ + return insert(str, LUA_T_STRING, &string_root[(unsigned)str[0]%NUM_HASHS]); +} + + +void luaI_strcallIM (TaggedString *l) +{ + TObject o; + ttype(&o) = LUA_T_USERDATA; + for (; l; l=l->next) { + tsvalue(&o) = l; + luaI_gcIM(&o); + } +} + + +void luaI_strfree (TaggedString *l) +{ + while (l) { + TaggedString *next = l->next; + luaI_free(l); + l = next; + } } /* ** Garbage collection function. -** This function traverse the string list freeing unindexed strings */ -Long lua_strcollector (void) +TaggedString *luaI_strcollector (long *acum) { Long counter = 0; + TaggedString *frees = NULL; int i; for (i=0; imarked = 0; else { - luaI_free(t); + t->next = frees; + frees = t; tb->hash[j] = &EMPTY; counter++; } } } } - return counter; + *acum += counter; + return frees; } diff --git a/src/tree.h b/src/tree.h index f3af0a0..22b81ae 100644 --- a/src/tree.h +++ b/src/tree.h @@ -1,7 +1,7 @@ /* ** tree.h ** TecCGraf - PUC-Rio -** $Id: tree.h,v 1.14 1996/02/26 17:07:49 roberto Exp $ +** $Id: tree.h,v 1.18 1997/06/09 17:28:14 roberto Exp $ */ #ifndef tree_h @@ -14,8 +14,15 @@ typedef struct TaggedString { - Word varindex; /* != NOT_USED if this is a symbol */ - Word constindex; /* != NOT_USED if this is a constant */ + int tag; /* if != LUA_T_STRING, this is a userdata */ + struct TaggedString *next; + union { + struct { + Word varindex; /* != NOT_USED if this is a symbol */ + Word constindex; /* != NOT_USED if this is a constant */ + } s; + void *v; /* if this is a userdata, here is its value */ + } u; unsigned long hash; /* 0 if not initialized */ int marked; /* for garbage collection; never collect (nor change) if > 1 */ char str[1]; /* \0 byte already reserved */ @@ -23,6 +30,9 @@ typedef struct TaggedString TaggedString *lua_createstring (char *str); -Long lua_strcollector (void); +TaggedString *luaI_createudata (void *udata, int tag); +TaggedString *luaI_strcollector (long *cont); +void luaI_strfree (TaggedString *l); +void luaI_strcallIM (TaggedString *l); #endif diff --git a/src/undump.c b/src/undump.c index 2e6ee07..1a00ef7 100644 --- a/src/undump.c +++ b/src/undump.c @@ -3,33 +3,28 @@ ** load bytecodes from files */ -char* rcs_undump="$Id: undump.c,v 1.21 1996/11/18 11:18:29 lhf Exp $"; +char* rcs_undump="$Id: undump.c,v 1.24 1997/06/17 18:19:17 roberto Exp $"; #include #include +#include "auxlib.h" #include "opcode.h" -#include "mem.h" +#include "luamem.h" #include "table.h" #include "undump.h" +#include "zio.h" static int swapword=0; static int swapfloat=0; static TFunc* Main=NULL; /* functions in a chunk */ static TFunc* lastF=NULL; -static void warn(char* s) /* TODO: remove */ -{ -#if 0 - fprintf(stderr,"undump: %s\n",s); -#endif -} - static void FixCode(Byte* code, Byte* end) /* swap words */ { Byte* p; for (p=code; p!=end;) { - OpCode op=(OpCode)*p; + int op=*p; switch (op) { case PUSHNIL: @@ -83,6 +78,8 @@ static void FixCode(Byte* code, Byte* end) /* swap words */ case STORELIST0: case ADJUST: case RETCODE: + case VARARGS: + case STOREMAP: p+=2; break; case STORELIST: @@ -132,7 +129,8 @@ static void FixCode(Byte* code, Byte* end) /* swap words */ break; } default: - lua_error("corrupt binary file"); + luaL_verror("corrupt binary file: bad opcode %d at %d\n", + op,(int)(p-code)); break; } } @@ -150,149 +148,152 @@ static void Unthread(Byte* code, int i, int v) } } -static int LoadWord(FILE* D) +static int LoadWord(ZIO* Z) { Word w; - fread(&w,sizeof(w),1,D); + zread(Z,&w,sizeof(w)); if (swapword) { - Byte* p=(Byte*)&w; /* TODO: need union? */ + Byte* p=(Byte*)&w; Byte t; t=p[0]; p[0]=p[1]; p[1]=t; } return w; } -static int LoadSize(FILE* D) +static int LoadSize(ZIO* Z) { - Word hi=LoadWord(D); - Word lo=LoadWord(D); + Word hi=LoadWord(Z); + Word lo=LoadWord(Z); int s=(hi<<16)|lo; if ((Word)s != s) lua_error("code too long"); return s; } -static void* LoadBlock(int size, FILE* D) +static void* LoadBlock(int size, ZIO* Z) { void* b=luaI_malloc(size); - fread(b,size,1,D); + zread(Z,b,size); return b; } -static char* LoadString(FILE* D) +static char* LoadString(ZIO* Z) { - int size=LoadWord(D); + int size=LoadWord(Z); char *b=luaI_buffer(size); - fread(b,size,1,D); + zread(Z,b,size); return b; } -static char* LoadNewString(FILE* D) +static char* LoadNewString(ZIO* Z) { - return LoadBlock(LoadWord(D),D); + return LoadBlock(LoadWord(Z),Z); } -static void LoadFunction(FILE* D) +static void LoadFunction(ZIO* Z) { TFunc* tf=new(TFunc); tf->next=NULL; tf->locvars=NULL; - tf->size=LoadSize(D); - tf->lineDefined=LoadWord(D); + tf->size=LoadSize(Z); + tf->lineDefined=LoadWord(Z); if (IsMain(tf)) /* new main */ { - tf->fileName=LoadNewString(D); + tf->fileName=LoadNewString(Z); Main=lastF=tf; } else /* fix PUSHFUNCTION */ { - tf->marked=LoadWord(D); + tf->marked=LoadWord(Z); tf->fileName=Main->fileName; memcpy(Main->code+tf->marked,&tf,sizeof(tf)); lastF=lastF->next=tf; } - tf->code=LoadBlock(tf->size,D); + tf->code=LoadBlock(tf->size,Z); if (swapword || swapfloat) FixCode(tf->code,tf->code+tf->size); while (1) /* unthread */ { - int c=getc(D); + int c=zgetc(Z); if (c==ID_VAR) /* global var */ { - int i=LoadWord(D); - char* s=LoadString(D); + int i=LoadWord(Z); + char* s=LoadString(Z); int v=luaI_findsymbolbyname(s); Unthread(tf->code,i,v); } else if (c==ID_STR) /* constant string */ { - int i=LoadWord(D); - char* s=LoadString(D); + int i=LoadWord(Z); + char* s=LoadString(Z); int v=luaI_findconstantbyname(s); Unthread(tf->code,i,v); } else { - ungetc(c,D); + zungetc(Z); break; } } } -static void LoadSignature(FILE* D) +static void LoadSignature(ZIO* Z) { char* s=SIGNATURE; - while (*s!=0 && getc(D)==*s) + while (*s!=0 && zgetc(Z)==*s) ++s; - if (*s!=0) lua_error("bad signature"); + if (*s!=0) lua_error("cannot load binary file: bad signature"); } -static void LoadHeader(FILE* D) /* TODO: error handling */ +static void LoadHeader(ZIO* Z) { Word w,tw=TEST_WORD; float f,tf=TEST_FLOAT; int version; - LoadSignature(D); - version=getc(D); + LoadSignature(Z); + version=zgetc(Z); if (version>0x23) /* after 2.5 */ { - int oldsizeofW=getc(D); - int oldsizeofF=getc(D); - int oldsizeofP=getc(D); + int oldsizeofW=zgetc(Z); + int oldsizeofF=zgetc(Z); + int oldsizeofP=zgetc(Z); if (oldsizeofW!=2) - lua_error("cannot load binary file created on machine with sizeof(Word)!=2"); + luaL_verror( + "cannot load binary file created on machine with sizeof(Word)=%d; " + "expected 2",oldsizeofW); if (oldsizeofF!=4) - lua_error("cannot load binary file created on machine with sizeof(float)!=4. not an IEEE machine?"); - if (oldsizeofP!=sizeof(TFunc*)) /* TODO: pack */ - lua_error("cannot load binary file: different pointer sizes"); + luaL_verror( + "cannot load binary file created on machine with sizeof(float)=%d; " + "expected 4\nnot an IEEE machine?",oldsizeofF); + if (oldsizeofP!=sizeof(TFunc*)) /* TODO: pack? */ + luaL_verror( + "cannot load binary file created on machine with sizeof(TFunc*)=%d; " + "expected %d",oldsizeofP,(int)sizeof(TFunc*)); } - fread(&w,sizeof(w),1,D); /* test word */ + zread(Z,&w,sizeof(w)); /* test word */ if (w!=tw) { swapword=1; - warn("different byte order"); } - fread(&f,sizeof(f),1,D); /* test float */ + zread(Z,&f,sizeof(f)); /* test float */ if (f!=tf) { - Byte* p=(Byte*)&f; /* TODO: need union? */ + Byte* p=(Byte*)&f; Byte t; swapfloat=1; t=p[0]; p[0]=p[3]; p[3]=t; t=p[1]; p[1]=p[2]; p[2]=t; if (f!=tf) /* TODO: try another perm? */ - lua_error("different float representation"); - else - warn("different byte order in floats"); + lua_error("cannot load binary file: unknown float representation"); } } -static void LoadChunk(FILE* D) +static void LoadChunk(ZIO* Z) { - LoadHeader(D); + LoadHeader(Z); while (1) { - int c=getc(D); - if (c==ID_FUN) LoadFunction(D); else { ungetc(c,D); break; } + int c=zgetc(Z); + if (c==ID_FUN) LoadFunction(Z); else { zungetc(Z); break; } } } @@ -300,30 +301,26 @@ static void LoadChunk(FILE* D) ** load one chunk from a file. ** return list of functions found, headed by main, or NULL at EOF. */ -TFunc* luaI_undump1(FILE* D) +TFunc* luaI_undump1(ZIO* Z) { - while (1) + int c=zgetc(Z); + if (c==ID_CHUNK) { - int c=getc(D); - if (c==ID_CHUNK) - { - LoadChunk(D); - return Main; - } - else if (c==EOF) - return NULL; - else - lua_error("not a lua binary file"); + LoadChunk(Z); + return Main; } + else if (c!=EOZ) + lua_error("not a lua binary file"); + return NULL; } /* ** load and run all chunks in a file */ -int luaI_undump(FILE* D) +int luaI_undump(ZIO* Z) { TFunc* m; - while ((m=luaI_undump1(D))) + while ((m=luaI_undump1(Z))) { int status=luaI_dorun(m); luaI_freefunc(m); diff --git a/src/undump.h b/src/undump.h index 8d757e3..3937358 100644 --- a/src/undump.h +++ b/src/undump.h @@ -1,10 +1,14 @@ /* ** undump.h ** definitions for lua decompiler -** $Id: undump.h,v 1.3 1996/11/14 11:44:34 lhf Exp $ +** $Id: undump.h,v 1.6 1997/06/17 18:19:17 roberto Exp $ */ +#ifndef undump_h +#define undump_h + #include "func.h" +#include "zio.h" #define IsMain(f) (f->lineDefined==0) @@ -15,9 +19,12 @@ #define ID_VAR 'V' #define ID_STR 'S' #define SIGNATURE "Lua" -#define VERSION 0x25 /* 2.5 */ +#define VERSION 0x25 /* last format change was in 2.5 */ #define TEST_WORD 0x1234 /* a word for testing byte ordering */ #define TEST_FLOAT 0.123456789e-23 /* a float for testing representation */ -TFunc* luaI_undump1(FILE* D); /* load one chunk */ -int luaI_undump(FILE* D); /* load all chunks */ + +TFunc* luaI_undump1(ZIO* Z); +int luaI_undump(ZIO* Z); /* load all chunks */ + +#endif diff --git a/src/zio.c b/src/zio.c new file mode 100644 index 0000000..2af49f4 --- /dev/null +++ b/src/zio.c @@ -0,0 +1,79 @@ +/* +* zio.c +* a generic input stream interface +* $Id: zio.c,v 1.2 1997/06/20 19:25:54 roberto Exp $ +*/ + +#include +#include +#include +#include "zio.h" + + +/* ----------------------------------------------------- memory buffers --- */ + +static int zmfilbuf(ZIO* z) +{ + return EOZ; +} + +ZIO* zmopen(ZIO* z, char* b, int size) +{ + if (b==NULL) return NULL; + z->n=size; + z->p= (unsigned char *)b; + z->filbuf=zmfilbuf; + z->u=NULL; + return z; +} + +/* ------------------------------------------------------------ strings --- */ + +ZIO* zsopen(ZIO* z, char* s) +{ + if (s==NULL) return NULL; + return zmopen(z,s,strlen(s)); +} + +/* -------------------------------------------------------------- FILEs --- */ + +static int zffilbuf(ZIO* z) +{ + int n=fread(z->buffer,1,ZBSIZE,z->u); + if (n==0) return EOZ; + z->n=n-1; + z->p=z->buffer; + return *(z->p++); +} + + +ZIO* zFopen(ZIO* z, FILE* f) +{ + if (f==NULL) return NULL; + z->n=0; + z->p=z->buffer; + z->filbuf=zffilbuf; + z->u=f; + return z; +} + + +/* --------------------------------------------------------------- read --- */ +int zread(ZIO *z, void *b, int n) +{ + while (n) { + int m; + if (z->n == 0) { + if (z->filbuf(z) == EOZ) + return n; /* retorna quantos faltaram ler */ + zungetc(z); /* poe o resultado de filbuf no buffer */ + } + m = (n <= z->n) ? n : z->n; /* minimo de n e z->n */ + memcpy(b, z->p, m); + z->n -= m; + z->p += m; + b = (char *)b + m; + n -= m; + } + return 0; +} diff --git a/src/zio.h b/src/zio.h new file mode 100644 index 0000000..f0f3640 --- /dev/null +++ b/src/zio.h @@ -0,0 +1,48 @@ +/* +* zio.h +* a generic input stream interface +* $Id: zio.h,v 1.5 1997/06/20 19:25:54 roberto Exp $ +*/ + +#ifndef zio_h +#define zio_h + +#include + + + +/* For Lua only */ +#define zFopen luaZ_Fopen +#define zsopen luaZ_sopen +#define zmopen luaZ_mopen +#define zread luaZ_read + +#define EOZ (-1) /* end of stream */ + +typedef struct zio ZIO; + +ZIO* zFopen(ZIO* z, FILE* f); /* open FILEs */ +ZIO* zsopen(ZIO* z, char* s); /* string */ +ZIO* zmopen(ZIO* z, char* b, int size); /* memory */ + +int zread(ZIO* z, void* b, int n); /* read next n bytes */ + +#define zgetc(z) (--(z)->n>=0 ? ((int)*(z)->p++): (z)->filbuf(z)) +#define zungetc(z) (++(z)->n,--(z)->p) + + + +/* --------- Private Part ------------------ */ + +#define ZBSIZE 256 /* buffer size */ + +struct zio { + int n; /* bytes still unread */ + unsigned char* p; /* current position in buffer */ + int (*filbuf)(ZIO* z); + void* u; /* additional data */ + unsigned char buffer[ZBSIZE]; /* buffer */ +}; + + +#endif diff --git a/test/README b/test/README index 625644d..6f410ee 100644 --- a/test/README +++ b/test/README @@ -1,7 +1,6 @@ These are simple tests for Lua. Some of them contain useful code. They are meant to be run to make sure Lua is ok and also to be read, to see how Lua programs can look like. -In the directory examples/, there is more useful code, such as a library for -complex arithmetic (a good example of fallbacks for overloading and redefinition -of primitive functions), and a library for PostScript output. Both libraries -include simple examples. + +In the directory examples/, there is more useful code: a library for PostScript +output and a database for a fake web site. diff --git a/test/array.lua b/test/array.lua index 7caca88..48c2857 100644 --- a/test/array.lua +++ b/test/array.lua @@ -2,14 +2,14 @@ $debug a = {} -i=0 +local i=0 while i<10 do a[i] = i*i i=i+1 end -r,v = next(a,nil) +local r,v = next(a,nil) while r ~= nil do - print ("array["..r.."] = "..v) + write ("array[",r,"] = ",v,"\n") r,v = next(a,r) end diff --git a/test/bisect.lua b/test/bisect.lua index cfb1bbf..8b72065 100644 --- a/test/bisect.lua +++ b/test/bisect.lua @@ -2,7 +2,7 @@ $debug -- bisection method for solving non-linear equations function bisect(f,a,b,fa,fb) -print(n.." a="..a.." fa="..fa.." b="..b.." fb="..fb) + write(n," a=",a," fa=",fa," b=",b," fb=",fb,"\n") local c=(a+b)/2 if abs(a-b)=0 then s="+" else s="" end - Complex.oldprint(x.re..s..x.im.."I") - end -end - -function Complex.newabs(x) - if type(x)~="complex" then - return Complex.oldabs(x) - else - return Complex.abs(x) - end -end - -Complex.oldfallback=setfallback("arith",Complex.fallback) -Complex.oldtype=type type=Complex.newtype -Complex.oldprint=print print=Complex.print -Complex.oldabs=abs abs=Complex.abs diff --git a/test/examples/complex/mandel.lua b/test/examples/complex/mandel.lua deleted file mode 100644 index 5e3d3eb..0000000 --- a/test/examples/complex/mandel.lua +++ /dev/null @@ -1,25 +0,0 @@ -dofile("complex.lua") - -xmin=-2 xmax=2 ymin=-2 ymax=2 -d=.125 - -function level(x,y) - local c=complex(x,y) - local l=0 - local z=c - repeat - z=z*z+c - l=l+1 - until abs(z)>2 or l>255 - return l-1 -end - -x=xmin -while xProgram of Computer Graphics, '.. +'Cornell University', + WWW="|PCG|/~celes/", + AREAS="Image segmentation and 3D reconstruction; " +.."Physical simulation and educational software;" +.."Geometric modeling and topological data structures;" +.."Extension languages and customizable applications" +} + +staff{ + LOGIN="lhf", + NAME="Luiz Henrique de Figueiredo", + TITLE='D.Sc., IMPA, 1992', + POSITION='Visiting Research fellow at LNCC; Consultant at |TECGRAF|', + AREAS="Geometric modeling; Software tools", + WWW="http://www2.lncc.br/~lhf/", +} diff --git a/test/examples/www/staff.lua b/test/examples/www/staff.lua new file mode 100644 index 0000000..7fa5b81 --- /dev/null +++ b/test/examples/www/staff.lua @@ -0,0 +1,37 @@ +$debug + +readfrom("template.html") +TEMPLATE=read(".*") +readfrom() + +PAT="|(%a%a*)|" + +GLOBAL={ + DATE=date("%d/%m/%Y %T"), +} + +function get(i) + if LOCAL[i] then return LOCAL[i] + elseif GLOBAL[i] then return GLOBAL[i] + else return "?"..i.."?" end +end + +function global(t) + local i,v=next(t,nil) + while i do + GLOBAL[i]=v + i,v=next(t,i) + end +end + +function staff(t) + LOCAL=t + if t.AREAS then t.AREAS=gsub(t.AREAS,"[;,] *","\n
  • ") end + local p,n=TEMPLATE + if t.WWW=="" then p=gsub(p,'|NAME|',"|NAME|") end + repeat p,n=gsub(p,PAT,get) until n==0 + write(t.LOGIN,"\n") + writeto(t.LOGIN..".html") + write(p) + writeto() +end diff --git a/test/examples/www/template.html b/test/examples/www/template.html new file mode 100644 index 0000000..c8494b7 --- /dev/null +++ b/test/examples/www/template.html @@ -0,0 +1,29 @@ + + + +Imaginary web site:Staff:|LOGIN| + + + + +

    |NAME|

    +|EMAIL| +

    + +|POSITION|
    +|TITLE|

    + +

    Research areas

    +
      +
    • |AREAS| +
    +

    + +


    +Last update in |DATE| by +websmaster. +

    + + + + diff --git a/test/hello.lua b/test/hello.lua index 639144b..ea818b9 100644 --- a/test/hello.lua +++ b/test/hello.lua @@ -1,3 +1,3 @@ -- the first program in every language -print("hello world, from Lua!") +write("hello world, from Lua!\n") diff --git a/test/loop.lua b/test/loop.lua deleted file mode 100644 index b464d09..0000000 --- a/test/loop.lua +++ /dev/null @@ -1,6 +0,0 @@ -$debug -i=0 -repeat - print(i) - i=i+1 -until i>10 diff --git a/test/lua b/test/lua new file mode 100755 index 0000000..e69de29 diff --git a/test/luac b/test/luac new file mode 100755 index 0000000..e69de29 diff --git a/test/sort.lua b/test/sort.lua index d665e96..a5eb095 100644 --- a/test/sort.lua +++ b/test/sort.lua @@ -28,7 +28,7 @@ function selectionsort(a,n) end function show(m,x) - write(m.."\n\t") + write(m,"\n\t") local i=0 while x[i] do write(x[i]) diff --git a/test/split.lua b/test/split.lua deleted file mode 100644 index 0f64c50..0000000 --- a/test/split.lua +++ /dev/null @@ -1,18 +0,0 @@ -function split (s) - local n = 1 - local f = strfind(s,"/") - while f do - n = n+f - f = strfind(strsub(s,n),"/") - end - return strsub(s,1,n-1), strsub(s,n) -end - - -function test(s) - local path, filename = split(s) - print(s .. "=[".. path.."]+["..filename.."]") -end - -test("a:/lua/obj/lua.c") -test("lua.lib") diff --git a/test/type.lua b/test/type.lua deleted file mode 100644 index 5bfc33e..0000000 --- a/test/type.lua +++ /dev/null @@ -1,37 +0,0 @@ -$debug - -function check (object, class) - local v = next(object,nil); - while v ~= nil do - if class[v] == nil then - print("unknown field: " .. v) - elseif type(object[v]) ~= class[v].type then - print("wrong type for field " .. v) - end - v = next(object,v); - end - v = next(class,nil); - while v ~= nil do - if object[v] == nil then - if class[v].default ~= nil then - object[v] = class[v].default - else - print("field "..v.." not initialized") - end - end - v = next(class,v); - end -end - -typeblock = {x = {default = 0, type = "number"}, - y = {default = 0, type = "number"}, - name = {type = "string"} - } - -function block(t) check(t,typeblock) end - -block{ x = 7, name = "3"} -block{ x = "7", name = "3"} -block{ x = 7, name = 3} -block{ x = 7} -block{ x = 7, name = "3", bogus=3.14} -- 2.11.4.GIT